WinForm多线程+委托防止界面假死

时间:2021-11-23 17:25:56

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

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 MutiThread
{
public partial class Form1 : Form
{
DataTable table;
int currentIndex = ;
int max = ; public Form1()
{
InitializeComponent();
} private void buttonOK_Click(object sender, EventArgs e)
{
buttonOK.Enabled = false;
Thread thread = new Thread(new ThreadStart(LoadData));
thread.IsBackground = true;
thread.Start(); progressBar1.Minimum = ;
progressBar1.Maximum = max;
} private void LoadData()
{
SetLabelText("数据加载中...");
currentIndex = ;
table = new DataTable();
table.Columns.Add("id");
table.Columns.Add("name");
table.Columns.Add("age");
while (currentIndex < max)
{
SetLabelText(string.Format("当前行:{0},剩余量:{1},完成比例:{2}%",
currentIndex, max-currentIndex, (Convert.ToDecimal(currentIndex) / Convert.ToDecimal(max) * ).ToString()));
SetPbValue(currentIndex);
DataRow dr = table.NewRow();
dr["id"] = currentIndex;
dr["name"] = "张三";
dr["age"] = currentIndex + ;
table.Rows.Add(dr);
currentIndex++;
} SetDgvDataSource(table);
SetLabelText("数据加载完成"); this.BeginInvoke(new MethodInvoker(delegate()
{
buttonOK.Enabled = true;
}));
} delegate void labDelegate(string str);
private void SetLabelText(string str)
{
if (label1.InvokeRequired)
{
Invoke(new labDelegate(SetLabelText), 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;
}
} private delegate void pbDelegate(int value);
private void SetPbValue(int value)
{
if (progressBar1.InvokeRequired)
{
Invoke(new pbDelegate(SetPbValue), new object[] { value }); }
else
{
progressBar1.Value = value;
}
} }
}

程序运行界面如下:

WinForm多线程+委托防止界面假死