Winform软件,不要在线程里操作UI
对于Winform软件,不要在线程里操作UI,不要相信:StartForm.CheckForIllegalCrossThreadCalls = false;
于是,把所有的代码都改成主线程委托调用的方式
private delegate void SetTextHandle(string id, string value);private void ThreadSetText(string id, string value){this.Controls.Find(id, true)[0].Text = value;}private void SetText(string id, string value){if (this.InvokeRequired){this.Invoke(new SetTextHandle(ThreadSetText), new object[] { id, value });}else{ThreadSetText(id, value);}}
2
// the canonical form (C# consumer)public delegate void ControlStringConsumer(Control control, string text); // defines a delegate typepublic void SetText(Control control, string text) {if (control.InvokeRequired) {control.Invoke(new ControlStringConsumer(SetText), new object[]{control, text}); // invoking itself} else {control.Text=text; // the "functional part", executing only on the main thread}
}
3
public static class ControlHelpers
{public static void InvokeIfRequired<T>(this T control, Action<T> action) where T : ISynchronizeInvoke{if (control.InvokeRequired){control.Invoke(new Action(() => action(control)), null);}else{action(control);}}
}
Use it like this:
private void UpdateSummary(string text) { summary.InvokeIfRequired(s => { s.Text = text }); }
3
theLabel.Invoke(new Action(() => theLabel.Text = "hello world from worker thread!"));
4
public static void InvokeIfRequired(this Control control, MethodInvoker action)
{if (control.InvokeRequired) {control.Invoke(action);} else {action();}
}
调用:
richEditControl1.InvokeIfRequired(() =>
{// Do anything you want with the control hererichEditControl1.RtfText = value;RtfHelpers.AddMissingStyles(richEditControl1);
});
更新为:
public static void InvokeIfRequired(this ISynchronizeInvoke obj,MethodInvoker action)
{if (obj.InvokeRequired) {var args = new object[0];obj.Invoke(action, args);} else {action();}
}
考虑仍出现异常时:
while (!control.Visible) { System.Threading.Thread.Sleep(50); }
5
public static void InvokeIfRequired(this Control c, Action<Control> action)
{if(c.InvokeRequired){c.Invoke(new Action(() => action(c)));}else{action(c);}
}
变更为:
public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
调用方法:
object1.InvokeIfRequired(c => { c.Visible = true; });
Winform软件,不要在线程里操作UI相关推荐
- android操作ui线程
runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, "网络 ...
- Android开发:操作UI线程4种方法
我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据.但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的.下面总结4 ...
- android中多线程与ui,Android UI线程和非UI线程
UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程. 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的UI组件发生交互. 所以主 ...
- android 不能在子线程中更新ui的讨论和分析
问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...
- 5.UI线程和非UI线程的交互方式
转载请标明出处: http://blog.csdn.net/yujun411522/article/details/46041637 本文出自:[yujun411522的博客] 这里说的交互方式应该 ...
- C#线程操作UI控件
在写winform程序时候,如果时间长的操作不用线程操作.那么会卡死UI,点击界面就体现为未响应.为此需要对耗时操作用线程处理,比如检验的监听程序就是一个死循环,不停检查文件夹或数据库又没有数据,然后 ...
- android 异步回调中操作UI线程,UI同步、卡死阻塞等性能问题
android开发中,回调无处不在,整个android开发的框架就是以回调机制建立起来的.如:activity,service,broadcast,fragment,view事件监听,baseadap ...
- C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它...
C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件"Form1"的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 usin ...
- 【源码】让源码告诉你:为什么在子线程无法更新 UI 操作?
博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/ ...
最新文章
- 计算机控制技术在线,西交19春《计算机控制技术》在线作业【标准答案】
- 30行python代码设计_30行Python代码实现3D数据可视化
- typescript 学习
- java 集合类 *****
- Filter过滤器拦截路径配置
- Python由浅入深编程(概念)实战
- 【博弈找规律问题汇总】
- Springboot实现拦截器与过滤器
- java和C程序员工资待遇差别大吗
- 微博热词搜索并生成云词html(完整)
- Android studio突然报错Entry name ‘META-INF/androidx.vectordrawable_vectordrawable.version‘ collided的解决办法
- 每日一Tip:Jetbrains旗下集成环境(pycharm、IDEA等)使用Ctrl +鼠标滚轮上下滑放大缩小快捷键设置
- 超声波测距 c语言程序流程图,超声波测距程序(详细C语言数码管显示)
- 会议室预约系统 会议预约 会议预约触摸屏 会议预约管理系统
- 传统的6d位姿估计fangfa1_6D姿态估计算法汇总(上)
- 英语六级常考核心词汇02
- 【JAVA】-- 多线程(线程让步yield、线程插队join)
- Andorid资源瘦身去重丶图片压缩丶混淆插件(1)
- 联想童夫尧:韬光养晦、空中换引擎,加速企业级市场增长
- matlab 方程组 无解,用matlab求解非线性方程组说无解,一定是方程组本身无解,还是有可能程序有问题呢? - 计算模拟 - 小木虫 - 学术 科研 互动社区...
热门文章
- jQuery的$.each的使用(遍历数组、对象、li集合、选中的option)
- frameset嵌套多个html,在一个html的js中调用另一个html的变量和函数(导航栏更新个人图标)
- 总结nodejs的优缺点
- pyspark的ALS协同过滤推荐算法-小结1
- VB 各种进制相互转换大全
- 《中国AI算力发展评估报告》发布!北京只能排第二,推理需求猛增
- GitHub标星2600,从零开始的深度学习实用教程 | PyTorch官方推荐
- 要抢足球教练饭碗!切尔西未来或将用上AI教练
- 与神经网络相比,你对P图一无所知
- AI助特朗普当选?FB史上最大数据滥用曝光,牵出ACL终身奖得主