Winform解决跨线程更新UI的问题

 jx   2022-07-01 09:46:24   2046 人阅读  0 条评论

最近又拿起了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

来发送内容了

本文地址:http://www.jvxiang.com/Post?id=30
版权声明:本文为原创文章,版权归 jx 所有,欢迎分享本文,转载请保留出处!
 相关文章  关键词:

 发表评论

{if $option['ZC_COMMENT_VERIFY_ENABLE']}

{/if}


表情

还没有留言,还不快点抢沙发?