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
来发送内容了
分类:
.net core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了