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 @   jvx  阅读(1758)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示