对于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相关推荐

  1. android操作ui线程

    runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, "网络 ...

  2. Android开发:操作UI线程4种方法

    我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据.但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的.下面总结4 ...

  3. android中多线程与ui,Android UI线程和非UI线程

    UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程. 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的UI组件发生交互. 所以主 ...

  4. android 不能在子线程中更新ui的讨论和分析

    问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...

  5. 5.UI线程和非UI线程的交互方式

    转载请标明出处:  http://blog.csdn.net/yujun411522/article/details/46041637 本文出自:[yujun411522的博客] 这里说的交互方式应该 ...

  6. C#线程操作UI控件

    在写winform程序时候,如果时间长的操作不用线程操作.那么会卡死UI,点击界面就体现为未响应.为此需要对耗时操作用线程处理,比如检验的监听程序就是一个死循环,不停检查文件夹或数据库又没有数据,然后 ...

  7. android 异步回调中操作UI线程,UI同步、卡死阻塞等性能问题

    android开发中,回调无处不在,整个android开发的框架就是以回调机制建立起来的.如:activity,service,broadcast,fragment,view事件监听,baseadap ...

  8. C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它...

    C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件"Form1"的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 usin ...

  9. 【源码】让源码告诉你:为什么在子线程无法更新 UI 操作?

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

最新文章

  1. 计算机控制技术在线,西交19春《计算机控制技术》在线作业【标准答案】
  2. 30行python代码设计_30行Python代码实现3D数据可视化
  3. typescript 学习
  4. java 集合类 *****
  5. Filter过滤器拦截路径配置
  6. Python由浅入深编程(概念)实战
  7. 【博弈找规律问题汇总】
  8. Springboot实现拦截器与过滤器
  9. java和C程序员工资待遇差别大吗
  10. 微博热词搜索并生成云词html(完整)
  11. Android studio突然报错Entry name ‘META-INF/androidx.vectordrawable_vectordrawable.version‘ collided的解决办法
  12. 每日一Tip:Jetbrains旗下集成环境(pycharm、IDEA等)使用Ctrl +鼠标滚轮上下滑放大缩小快捷键设置
  13. 超声波测距 c语言程序流程图,超声波测距程序(详细C语言数码管显示)
  14. 会议室预约系统 会议预约 会议预约触摸屏 会议预约管理系统
  15. 传统的6d位姿估计fangfa1_6D姿态估计算法汇总(上)
  16. 英语六级常考核心词汇02
  17. 【JAVA】-- 多线程(线程让步yield、线程插队join)
  18. Andorid资源瘦身去重丶图片压缩丶混淆插件(1)
  19. 联想童夫尧:韬光养晦、空中换引擎,加速企业级市场增长
  20. matlab 方程组 无解,用matlab求解非线性方程组说无解,一定是方程组本身无解,还是有可能程序有问题呢? - 计算模拟 - 小木虫 - 学术 科研 互动社区...

热门文章

  1. jQuery的$.each的使用(遍历数组、对象、li集合、选中的option)
  2. frameset嵌套多个html,在一个html的js中调用另一个html的变量和函数(导航栏更新个人图标)
  3. 总结nodejs的优缺点
  4. pyspark的ALS协同过滤推荐算法-小结1
  5. VB 各种进制相互转换大全
  6. 《中国AI算力发展评估报告》发布!北京只能排第二,推理需求猛增
  7. GitHub标星2600,从零开始的深度学习实用教程 | PyTorch官方推荐
  8. 要抢足球教练饭碗!切尔西未来或将用上AI教练
  9. 与神经网络相比,你对P图一无所知
  10. AI助特朗普当选?FB史上最大数据滥用曝光,牵出ACL终身奖得主