①
Control.CheckForIllegalCrossThreadCalls = false;//关闭安全检查,为了安全一般不采用此代码
=============================================================================================================================
②
一般多线程代码:不能实现跨线程数据交互:
Thread thread = new Thread(new ThreadStart(Test));
thread.IsBackground = true;
thread.Start();
===============================================================================================================================
③
通过UI控件的Invoke/BeginInvoke方法更新,实现后台线程和UI线程数据交换
1.定义一个委托
delegate void delegate1(string text); //设置这个委托支持异步调用文本框控件的文本属性。不同控件可能需要不同参数
2.定义控件更新方法SetText //这个是实现线程数据交换的关键
private void SetText(string text)
{
if (this.textBox1.InvokeRequired) //如果调用控件的线程和创建创建控件的线程不是同一个则为True
{
while (!this.textBox1.IsHandleCreated)
{
//解决窗体关闭时出现“访问已释放句柄“的异常
if (this.textBox1.Disposing || this.textBox1.IsDisposed)
return;
}
delegate1 d = new delegate1(SetText); //委托实例化
this.textBox1.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
3.次线程运行的主要代码
private void test()
{
int i;
for (i = 1; i <= 10; i++)
{
Thread.Sleep(1000);
this.SetText(i.ToString()); //此处需要和UI线程实时交换数据,我们引用上门定义的方法SetText来实现,这一步是关键
}
MessageBox.Show("运行完毕");
}
4.控件事件代码
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(test)); //创建新线程
thread.IsBackground = true; //设定线程为后台线程
thread.Start(); //启动新线程
}
winform 实现多线程更新UI控件的方法
最新推荐文章于 2024-06-20 17:56:59 发布