Winform解决跨线程更新UI的问题
最近又拿起了Winform的程序,由于要起socket server,所以需要起线程,这里就遇到了经典的跨线程UI调用的问题。
如果什么都不写,直接由线程更新UI,会报错:线程间操作无效
。
这里的解决方案一般有三种:
第一种,去掉主线程安全检查。这种方式非常不安全,可能引起崩溃,所以基本上不推荐这种方式:
Control.CheckForIllegalCrossThreadCalls = false;
只需要加入这句话,直接在线程中更新UI也不会报错了。
第二种,使用invoke
来处理,这种算是比较常见的用法。
this.textBox1.Invoke(new Action(() => {this.textBox1.Text = "test"}));
这样就可以了。
但是注意这种用法下可能产生控件已释放的问题。所以最好在处理之前先判断一下
while(!this.textBox1.IsHandleCreated)
{
if (textBox1.Disposing || textBox1.IsDisposed)
{
return;
}
}
这样就能保证不报错了。
第三种,使用同步上下文SynchronizationContext
方法。获取主线程的上下文信息,然后使用Post
或者Send
方法发送。
private SynchronizationContext _synchronizationContext;
public Form1()
{
_synchronizationContext = SynchronizationContext.Current;
}
然后就可以使用
_synchronizationContext.Post
来发送内容了