线程间操作无效: 从不是创建控件的线程访问它的三种方法
2015-11-12 11:07
417 查看
看下解决办法吧
1、把CheckForIllegalCrossThreadCalls设置为false
2、利用委托
3、使用 BackgroundWorker控件
在应用程序中实现多线程的首选方式是使用 BackgroundWorker 组件。BackgroundWorker 组件使用事件驱动模型实现多线程。辅助线程运行 DoWork 事件处理程序,创建控件的线程运行 ProgressChanged 和 RunWorkerCompleted 事件处理程序。注意不要从 DoWork 事件处理程序调用您的任何控件。
下面的代码示例不异步执行任何工作,因此没有 DoWork 事件处理程序的实现。TextBox 控件的 Text 属性在 RunWorkerCompleted 事件处理程序中直接设置。
1、把CheckForIllegalCrossThreadCalls设置为false
2、利用委托
delegate void SetTextCallBack(string text); private void SetText(string text) { if (this.txt_a.InvokeRequired) { SetTextCallBack stcb = new SetTextCallBack(SetText); this.Invoke(stcb , new object[] { text}); } else { this.txt_a.Text = text; } } private void LoadData() { SetText("测试"); } //窗体加载时,用线程加载数据 private void Frm_ImportManager_Load(object sender, EventArgs e) { ThreadStart ts = new ThreadStart(LoadData); Thread thread = new Thread(ts); thread.Name = "LoadData"; thread.Start(); }
3、使用 BackgroundWorker控件
在应用程序中实现多线程的首选方式是使用 BackgroundWorker 组件。BackgroundWorker 组件使用事件驱动模型实现多线程。辅助线程运行 DoWork 事件处理程序,创建控件的线程运行 ProgressChanged 和 RunWorkerCompleted 事件处理程序。注意不要从 DoWork 事件处理程序调用您的任何控件。
下面的代码示例不异步执行任何工作,因此没有 DoWork 事件处理程序的实现。TextBox 控件的 Text 属性在 RunWorkerCompleted 事件处理程序中直接设置。
// This event handler starts the form's // BackgroundWorker by calling RunWorkerAsync. // // The Text property of the TextBox control is set // when the BackgroundWorker raises the RunWorkerCompleted // event. private void setTextBackgroundWorkerBtn_Click( object sender, EventArgs e) { this.backgroundWorker1.RunWorkerAsync(); } // This event handler sets the Text property of the TextBox // control. It is called on the thread that created the // TextBox control, so the call is thread-safe. // // BackgroundWorker is the preferred way to perform asynchronous // operations. private void backgroundWorker1_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e) { this.textBox1.Text = "This text was set safely by BackgroundWorker."; }
相关文章推荐
- Linux 下 Sublime Text 中文输入
- 国内常见的一些代码托管平台
- MapReduce作业运行流程整体分析
- SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案
- php通过循环链解决约瑟夫环
- NSJSONSerialization
- 学习笔记二十三-sql基础知识
- 07(maven+SSH)网上商城项目实战之springmvc乱码问题
- Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法
- Http——HTTPS和SSL/TLS协议
- IOS之sqlite3基本用法详解
- mybatis学习总结(一)
- Xcode之lldb的技巧
- java.lang.Integer.toHexString(b[n] & 0XFF)中0XFF使用的必要性
- Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法
- Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法
- Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法
- mac终端查看ios静态库是否支持64位
- ORACLE触发器详解
- SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息