WinForms程序使用委托(Invoke)的方式操作界面的控件
来源:互联网 发布:python高斯分布散点图 编辑:程序博客网 时间:2024/04/30 22:56
在WinForms程序开发中,有时使用多线程或者异步处理比较耗时的数据,处理完成后需要把结果反馈到程序界面上,这是就需要操作WinForms程序的界面控件了。
如果直接操作的话,则会出现以下错误
注:这个异常来源于.NET2的一个限制:工作线程不能访问窗口线程创建的控件。
线程间操作无效: 从不是创建控件“updateMaterial”的线程访问它。
解决方法有两种:
方法一:是在窗口线程中设置CheckForIllegalCrossThreadCalls = false (不推荐)
比如窗口中有一个button1,我要新建一个线程访问到button1。
this.button1.Enabled = false;new Thread(new ThreadStart(delegate(){ try { CheckForIllegalCrossThreadCalls = false; // 直接设置会引发异常:线程间操作无效,从不创建控件的线程访问它 this.button1.Enabled = true; }catch(Exception ex) { MessageBox.Show(ex.ToString()); } })).
方法二:使用委托的方式Invoke操作界面的控件(推荐)
private delegate void _SetButtonState(Button button,bool state);private void SetButtonState(Button button,bool state) { // 对于该控件的请求来自于创建该控件所在线程以外的线程 if (button.InvokeRequired) { _SetButtonState _set = new _SetButtonState(delegate(Button _button, bool _state) { _button.Enabled = _state; }); this.Invoke(_set, button, state); } else { button.Enabled = state; }}
创建一个线程调用这个委托
this.button1.Enabled = false;new Thread(new ThreadStart(delegate(){ try { // 直接设置会引发异常:线程间操作无效,从不创建控件的线程访问它 // CheckForIllegalCrossThreadCalls = false; // this.button1.Enabled = true; // 用委托的方式 SetButtonState(button1,true); }catch(Exception ex) { MessageBox.Show(ex.ToString()); } })).Start();
另外,附上一个修改的更为直接的Invoke函数
private delegate void _SetListData(); private void SetListData() { _SetListData _set = new _SetListData(delegate() { this.t_material_infoTableAdapter.Fill(this.materialDataSet.t_material_info); }); this.Invoke(_set); }
SetListData();
- WinForms程序使用委托(Invoke)的方式操作界面的控件
- C#多线程操作控件的两种安全方式(委托方式和BackgroundWorker控件方式)
- 使用委托及控件的invoke方法处理窗体控件的跨线程访问
- Winforms:透明的控件
- C# 多线程控制控件实例(invoke,控件的委托方法)
- 委托的invoke、beginInvoke和控件的invoke、beginInvoke的区别
- invoke委托解决“线程间操作无效: 从不是创建控件的线程访问它”的问题
- C#线程中安全访问控件(重用委托,避免繁复的delegate,Invoke)总结
- C#线程中安全访问控件(重用委托,避免繁复的delegate,Invoke)总结
- WinForms中TreeView控件的扩展与使用
- 基于WinForms(C#)的用户登录界面(VisualStudio2013)
- -----------------委托的使用场合 (使用方式)----------------
- C# 多线程操作界面时,使用Invoke与BeginInvoke的区别
- 委托控件的使用(Delegate Control)
- 解析大型.NET ERP系统 灵活复杂的界面控件Infragistics WinForms
- C# winForms Dialog的使用
- c#非委托方式在子线程里操作UI控件(实际上运算逻辑在子线程,更新还是在主线程,解决了UI界面无响应的问题)
- winforms 下的控件有效性验证
- 2012 Hadoop与大数据技术大会
- OCP-1Z0-053-V12.02-318题
- 主流开源cms、商城、点评、SNS、DIGG、RSS、分类信息
- 好文章
- 雕琢自己(感悟)
- WinForms程序使用委托(Invoke)的方式操作界面的控件
- 条件变量
- Google App Engine for java学习笔记
- 计算机著作推荐
- 《程序员》 -- 业务、销售与技术的关系
- git push :推送本地更改到远程仓库的三种模式
- cocoa论坛会员源码分享
- java 从零开始,学习笔记之基础入门<Static>(十二)
- Android开发必看知识,不看后悔