(转)c#多线程 Invoke方法的使用
2016-03-02 10:08
435 查看
原文地址:http://www.cnblogs.com/lovko/archive/2008/12/19/1358748.html
在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。
而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。
再举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..
命名空间为System.Windows.Forms
其它参考文章:
https://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.invokerequired(v=vs.100).aspx
http://www.cnblogs.com/songxingzhu/p/3677307.html
http://www.cnblogs.com/poorboy/archive/2013/05/09/3069997.html
http://www.cnblogs.com/Rustle/articles/11301.aspx(推荐阅读) http://www.cnblogs.com/marksun/archive/2012/02/29/2373383.html(推荐阅读) http://www.cnblogs.com/whssunboy/archive/2007/06/07/775319.html(推荐阅读)
在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。
而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。
再举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..
using System.Threading; public delegate void MyInvoke(string str); private void btnStartThread_Click(object sender, EventArgs e) { Thread thread = new Thread(new ThreadStart(DoWord)); thread.Start(); } public void DoWord() { MyInvoke mi = new MyInvoke(SetTxt); BeginInvoke(mi,new object[]{"abc"}); } public void SetTxt(string str) { txtReceive.Text += str + System.Environment.NewLine; }
命名空间为System.Windows.Forms
control.InvokeRequired 获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false。
其它参考文章:
https://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.invokerequired(v=vs.100).aspx
http://www.cnblogs.com/songxingzhu/p/3677307.html
http://www.cnblogs.com/poorboy/archive/2013/05/09/3069997.html
http://www.cnblogs.com/Rustle/articles/11301.aspx(推荐阅读) http://www.cnblogs.com/marksun/archive/2012/02/29/2373383.html(推荐阅读) http://www.cnblogs.com/whssunboy/archive/2007/06/07/775319.html(推荐阅读)
相关文章推荐
- C# Report根据条件设置显示颜色
- 【C#进阶系列】03 配置文件管理与程序集的引用版本重定向
- C# 数据类型分类
- 对象的筛选
- Distinct自定义去重
- c# vs编程中x,y的坐标单位是什么
- C#线程间同步的几种实现方式
- C#百万数据查询超时问题
- C#解决界面不响应
- C#调用SendMessage 用法
- C#开机自动启动程序代码
- C#操作文件
- C#复合控件获取值,及事件一处理顺顺序
- C#读取txt文件
- C# 操作XML
- C#毫秒转时分秒格式
- C# 反射笔记
- C#发送POST,GET,DELETE请求API,并接受返回值
- 【笔记】《C#大学教程》- 第3章 C#编程介绍
- C#中字符串前面加@的作用