zoukankan      html  css  js  c++  java
  • WinForm多线程+委托防止界面假死

    当有大量数据需要计算、显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
     
    namespace WindowsFormsApplication1
    {
        public partial class FormMain : Form
        {
            DataTable table;
            int currentIndex = 0;
            int max = 10000;
            public FormMain()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                button1.Enabled = false;
                Thread thread = new Thread(new ThreadStart(LoadData));
                thread.IsBackground = true;
                thread.Start();
     
                progressBar1.Minimum = 0;
                progressBar1.Maximum = max;
            }
            private void LoadData()
            {
                SetLableText("数据加载中...");
                currentIndex = 0;
                table = new DataTable();
                table.Columns.Add("id");
                table.Columns.Add("name");
                table.Columns.Add("age");
                while (currentIndex < max)
                {
                    SetLableText(string.Format("当前行:{0},剩余量:{1},完成比例:{2}%", currentIndex, max - currentIndex,
                             (Convert.ToDecimal(currentIndex) / Convert.ToDecimal(max) * 100).ToString("f0")));
                    SetPbValue(currentIndex);
                    DataRow dr = table.NewRow();
                    dr["id"] = currentIndex;
                    string name = "张三";
                    dr["name"] = name;
                    dr["age"] = currentIndex + 5;
                    table.Rows.Add(dr);
                    currentIndex++;
                }
                SetDgvDataSource(table);
                SetLableText("数据加载完成!");
     
                this.BeginInvoke(new MethodInvoker(delegate()
                {
                    button1.Enabled = true;
                }));
            }
            delegate void labDelegate(string str);
            private void SetLableText(string str)
            {
                if (label1.InvokeRequired)
                {
                    Invoke(new labDelegate(SetLableText), new string[] { str });
                }
                else
                {
                    label1.Text = str;
                }
            }
            delegate void dgvDelegate(DataTable table);
            private void SetDgvDataSource(DataTable table)
            {
                if (dataGridView1.InvokeRequired)
                {
                    Invoke(new dgvDelegate(SetDgvDataSource), new object[] { table });
                }
                else
                {
                    dataGridView1.DataSource = table;
                }
            }
            delegate void pbDelegate(int value);
            private void SetPbValue(int value)
            {
                if (progressBar1.InvokeRequired)
                {
                    Invoke(new pbDelegate(SetPbValue), new object[] { value });
                }
                else
                {
                    progressBar1.Value = value;
                }
            }
        }
    }<br>运行效果图:

    1
     

      

     
     
     
    标签: WinFormC#
  • 相关阅读:
    容器网络(一)docker容器网络驱动
    双指针遍历/滑动窗口 —— 209_长度最小的子数组
    双指针遍历/滑动窗口 —— 121_买卖股票的最佳时机
    双指针遍历/滑动窗口 —— 42_接雨水
    双指针遍历/滑动窗口 —— 26_删除排序数组中的重复项
    双指针遍历/滑动窗口 —— 16_最接近的三数之和
    双指针遍历/滑动窗口 —— 15_三数之和
    双指针遍历/滑动窗口 —— 11_盛最多水的容器
    双指针遍历/滑动窗口 —— 3_无重复字符的最长子串
    链表操作 —— 206_反转链表
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2865881.html
Copyright © 2011-2022 走看看