Winform 多线程中处理UI控件, 多线程中不能直接操作UI控件, 会引发线程安全异常
using System;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApp10
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/*
在窗体拖拽2个button,1个label
*/
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(Test1);
thread.Start();
}
// 线程中直接操作控件会引发线程安全异常
// Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on.'
private void Test1()
{
for (int i = 0; i < 1000; ++i)
{
label1.Text = i.ToString();
}
}
// Control.CheckForIllegalCrossThreadCalls = false;// 可以解决掉所有控件安全异常
private void Test2()
{
Control.CheckForIllegalCrossThreadCalls = false;
for (int i = 0; i < 1000; ++i)
{
label1.Text = i.ToString();
}
}
// 在线程中用委托操作UI控件
delegate void InvokeHandler();
private void Test3()
{
for (int i = 0; i < 1000; ++i)
{
// net 2.0
this.Invoke(new InvokeHandler(delegate ()
{
label1.Text = i.ToString();
}));
}
}
// 在线程中用委托操作UI控件
private void Test4()
{
for (int i = 0; i < 1000; ++i)
{
// net 3.5 以上
this.Invoke((Action)(() =>
{
label1.Text = i.ToString();
}));
}
}
}
}