.net 不允许跨线程访问控件
会提示 不是由创建线程访问
Cross-thread operation not valid:Control 'textBox1' accessed from a thread other than the thread it was created on .
解决方案:
1、设置Control.CheckForIllegalCrossThreadCalls
2、在工作线程使用委托
使用Control.BeginInvoke/Invoke
说明:
1、实际Control调用 begininvoke/invoke不会创建新线程 实际相当于post/send message
两者区别:
PostMessage只负责将消息放到消息队列中,不确定何时及是否处理
SendMessage要等到受到消息处理的返回码(DWord类型)后才继续
PostMessage执行后马上返回
SendMessage必须等到消息被处理后才会返回。
2. invoke 执行的委托 实际在由主线程执行函数
对比下面两个方式
#region 跨线程调用方法测试
delegate void newDelegate();
public void thMethod()
{
//方案一
//newDelegate del = new newDelegate(changeUI);
//this.BeginInvoke(del);
///*方案二
while (true)
{
Thread.Sleep(1000);
changeUI();
}
//*/
}
public void changeUI()
{
/*//方案一
while (true)
{
Thread.Sleep(1000);
this.label1.Text = System.DateTime.Now.ToString();
}*/
///*方案二
if (label1.InvokeRequired)
{
newDelegate de = new newDelegate(changeUI);
this.BeginInvoke(de);
}
else
this.label1.Text = System.DateTime.Now.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
Thread th = new Thread(thMethod);
th.IsBackground = true;
th.Start();
}
#endregion
changeUI函数委托在主线执行
方案一 在changeUI中执行了 死循环 会让主线程卡死方案二 在thMethod中由工作线程执行死循环 不会影响主线程更新控件的工作