C# 线程间操作无效: 从不是创建控件的线程访问它
最近在写C#,需求大概是:写一个窗体程序,该程序运行在本地客户端,与浏览器建立websocket连接。建立连接后,浏览器会发送消息给客户端,此时需要显示C#窗体主页面,调用代码于是就报如下错误。
突然了解到,websocket每次发送消息是一个新线程,而控件和窗体都是在主线程中创建,而C#为了防止多个线程调用控件导致各种问题,于是做了安全限制。如果需要调用的话,就需要通过委托(delegate)和线程(Thread)去完成。
代码如下:
delegate void SetTextCallback(string text);
private Thread thread;
private void CrossThreadinvoke()
{
thread = new Thread(new ThreadStart(ThreadProcSafe));
thread.Start();
}
private void ThreadProcSafe()
{
string text = "跨线程调用主窗体";
SetTextCallback deg = new SetTextCallback(showWindows);
this.Invoke(deg, new object[] { text });
}
private void showWindows(string text)
{
//需要执行的更新
this.Visible = true;
this.WindowState = FormWindowState.Maximized;
}
按照如上写法,即可调用到主线程控件,完成显示窗口。