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

来发送内容了

posted @ 2022-07-01 18:07  jvx  阅读(1723)  评论(0编辑  收藏  举报