004. 线程间操作无效: 从不是创建控件“textBox1”的线程访问它
最简单的方法(不推荐):
在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;
为什么不推荐上面的方法:
为避免空间造成死锁, .net framework 2.0 之后 拒绝多线程访问空间, 以前Control.CheckForIllegalCrossThreadCalls 默认就是flase, 2.0后默认为true。当然如果能保证程序中不会好几个线程同时操作一个控件用上面的方法也可以, 如果存在多个线程一起操作控件使用下面的方法; 下面是来自微软官网给出的示例:
三种处理方案见源码:
Form1.cs源码:
- using System;
- using System.ComponentModel;
- using System.Threading;
- using System.Windows.Forms;
- namespace CrossThreadDemo
- {
- public partial class Form1 : Form
- {
- //设置这个委托支持异步调用文本框控件的文本属性。
- delegate void SetTextCallback(string text);
- //这个线程用于演示和线程安全的和不安全的方法来调用一个Windows窗体控件。
- private Thread demoThread = null;
- //这个BackgroundWorker用于演示执行异步操作, 推荐使用该方法。
- private BackgroundWorker backgroundWorker1;
- private TextBox textBox1;
- private Button setTextUnsafeBtn;
- private Button setTextSafeBtn;
- private Button setTextBackgroundWorkerBtn;
- public Form1()
- {
- InitializeComponent();
- }
- //这个事件处理程序创建一个线程,该线程演示用不安全的方式调用 Windows窗体, 在.net framework2.0后被禁用
- private void setTextUnsafeBtn_Click(object sender,EventArgs e)
- {
- this.demoThread = new Thread(new ThreadStart(this.ThreadProcUnsafe));
- this.demoThread.Start();
- }
- //这个方法执行工作线程, 文本框控件不安全的调用, 一执行就会报错.
- private void ThreadProcUnsafe()
- {
- //线程间操作无效: 从不是创建控件“textBox1”的线程访问它。
- this.textBox1.Text = "This text was set unsafely.";
- }
- //这个事件处理程序创建一个线程,该线程使用安全的方式调用 Windows窗体.
- private void setTextSafeBtn_Click(object sender,EventArgs e)
- {
- this.demoThread = new Thread(new ThreadStart(this.ThreadProcSafe));
- this.demoThread.Start();
- }
- //这个方法执行工作线程,使 文本框控件的线程安全的调用.
- private void ThreadProcSafe()
- {
- this.SetText("This text was set safely.");
- }
- //这个方法演示了线程通过安全的模式, 调用一个Windows窗体控件。如果调用线程和当前创建了文本框控件的线程不用,该方法创建一个SetTextCallback,并使用了异步调用自身调用方法,
//如果调用线程创建的线程是一样的文本框控件,直接设置文本属性。- private void SetText(string text)
- {
- if (this.textBox1.InvokeRequired)
- {
- SetTextCallback d = new SetTextCallback(SetText);
- this.Invoke(d, new object[] { text });
- }
- else
- {
- //在此设置textBox1的文本
- this.textBox1.Text = text;
- }
- }
- //这个事件处理程序通过调用RunWorkerAsync BackgroundWorker。设置文本框控件的文本属性, 用BackgroundWorker提高RunWorkerCompleted事件。
- private void setTextBackgroundWorkerBtn_Click(object sender,EventArgs e)
- {
- this.backgroundWorker1.RunWorkerAsync();
- }
- //这个事件处理程序设置文本框的文本属性控制。它调用创建的线程文本框控件,所以调用是线程安全的,异步执行BackgroundWorker是首选方法操作.
- private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
- {
- this.textBox1.Text ="This text was set safely by BackgroundWorker.";
- }
- }
- }
Program.cs源码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Windows.Forms;
- namespace WindowsFormsApplication1
- {
- static class Program
- {
- /// <summary>
- /// 应用程序的主入口点。
- /// </summary>
- [STAThread]
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new CrossThreadDemo.Form1());
- }
- }
- }
Form1.Designer.cs源码:
- namespace CrossThreadDemo
- {
- partial class Form1
- {
- /// <summary>
- /// 必需的设计器变量。
- /// </summary>
- private System.ComponentModel.IContainer components = null;
- /// <summary>
- /// 清理所有正在使用的资源。
- /// </summary>
- /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
- #region Windows 窗体设计器生成的代码
- /// <summary>
- /// 设计器支持所需的方法 - 不要
- /// 使用代码编辑器修改此方法的内容。
- /// </summary>
- private void InitializeComponent()
- {
- this.textBox1 = new System.Windows.Forms.TextBox();
- this.setTextUnsafeBtn = new System.Windows.Forms.Button();
- this.setTextSafeBtn = new System.Windows.Forms.Button();
- this.setTextBackgroundWorkerBtn = new System.Windows.Forms.Button();
- this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
- this.SuspendLayout();
- //
- // textBox1
- //
- this.textBox1.Location = new System.Drawing.Point(, );
- this.textBox1.Name = "textBox1";
- this.textBox1.Size = new System.Drawing.Size(, );
- this.textBox1.TabIndex = ;
- //
- // setTextUnsafeBtn
- //
- this.setTextUnsafeBtn.Location = new System.Drawing.Point(, );
- this.setTextUnsafeBtn.Name = "setTextUnsafeBtn";
- this.setTextUnsafeBtn.Size = new System.Drawing.Size(, );
- this.setTextUnsafeBtn.TabIndex = ;
- this.setTextUnsafeBtn.Text = "Unsafe Call";
- this.setTextUnsafeBtn.Click += new System.EventHandler(this.setTextUnsafeBtn_Click);
- //
- // setTextSafeBtn
- //
- this.setTextSafeBtn.Location = new System.Drawing.Point(, );
- this.setTextSafeBtn.Name = "setTextSafeBtn";
- this.setTextSafeBtn.Size = new System.Drawing.Size(, );
- this.setTextSafeBtn.TabIndex = ;
- this.setTextSafeBtn.Text = "Safe Call";
- this.setTextSafeBtn.Click += new System.EventHandler(this.setTextSafeBtn_Click);
- //
- // setTextBackgroundWorkerBtn
- //
- this.setTextBackgroundWorkerBtn.Location = new System.Drawing.Point(, );
- this.setTextBackgroundWorkerBtn.Name = "setTextBackgroundWorkerBtn";
- this.setTextBackgroundWorkerBtn.Size = new System.Drawing.Size(, );
- this.setTextBackgroundWorkerBtn.TabIndex = ;
- this.setTextBackgroundWorkerBtn.Text = "Safe BW Call";
- this.setTextBackgroundWorkerBtn.Click += new System.EventHandler(this.setTextBackgroundWorkerBtn_Click);
- //
- // backgroundWorker1
- //
- this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
- //
- // Form1
- //
- this.ClientSize = new System.Drawing.Size(, );
- this.Controls.Add(this.setTextBackgroundWorkerBtn);
- this.Controls.Add(this.setTextSafeBtn);
- this.Controls.Add(this.setTextUnsafeBtn);
- this.Controls.Add(this.textBox1);
- this.Name = "Form1";
- this.Text = "Form1";
- this.Load += new System.EventHandler(this.Form1_Load);
- this.ResumeLayout(false);
- this.PerformLayout();
- }
- #endregion
- }
- }
窗体界面截图:
aaarticlea/png;base64,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" alt="" />
004. 线程间操作无效: 从不是创建控件“textBox1”的线程访问它的更多相关文章
- 关于“线程间操作无效: 从不是创建控件’textBox1‘的线程访问它”异常的解决方法
线程间操作无效: 从不是创建控件“textBox1”的线程访问它 背景:通过一个辅助线程计算出的一个值赋给textBox1.text;解决办法:1.直接在窗体的构造函数中加:System.Window ...
- 使用委托解决"线程间操作无效: 从不是创建控件“textBox1”的线程访问它" 问题
在winform编程中常遇到此类问题,造成辅助线程无法给控件赋值 //定义委托 private delegate void SetTextCallback(string text); //在给text ...
- c#线程间操作无效: 从不是创建控件“textBox1”的线程访问它
线程开始前: Control.CheckForIllegalCrossThreadCalls = false;
- bug:C#线程间操作无效: 从不是创建控件" XX" 的线程访问它
今天遇到这个问题,百度了下,把解决的方法总结出来.我们在ui线程创建的子线程操作ui控件时,系统提示错误详细信息为:线程间操作无效: 从不是创建控件“XXX”的线程访问它. 就我知道的有三种方法,先看 ...
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...
- 从.NET 1.1 升级到.NET 4.0 遇到 线程间操作无效: 从不是创建控件 [XX] 的线程访问它.
有两种方式解决 1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;2.使用Invoke等委托函数 问题原因是 .NET2.0 以后拒绝 ...
- System.InvalidOperationException:“线程间操作无效: 从不是创建控件“btnSearch”的线程访问它。
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“btnSearch”的线程访问它.”这个问题属于跨线程问题 在Form1重载中写上一行代码 Sys ...
- System.InvalidOperationException:“线程间操作无效: 从不是创建控件“txtPortName02”的线程访问它。”
“System.InvalidOperationException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 线程间操作无效: 从不是创建控件“tx ...
- C#: 线程间操作无效: 从不是创建控件“dataGridView”的线程访问它
最近在修改自动化小工具,用多线程来解决后台拷贝导致WinForm界面卡死的情况,但是遇到过错:线程间操作无效: 从不是创建控件“dataGridView”的线程访问它. 这是因为在多线程程序中,新创建 ...
随机推荐
- HD OJ2023
#include "stdio.h"double stu[60],cla[10];int a[60][60];int main(){ int n,m,i,number,j; whi ...
- 安装VMware Tools找不到内核头文件
http://blog.csdn.net/bobbat/article/details/38568885 安装VMware Tools,解决无法找到kernel header path的问题 安装 V ...
- 爬虫学习----pattern
1.match match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]): 这个方法将从string的pos下标处起尝试匹 ...
- LeetCode----Word Ladder 2
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...
- Saving structured data with json
Strings can easily be written to and read from a file. Numbers take a bit more effort, since the rea ...
- cookie 作用域
在http://xiaoyou-game.com/user/login方法中设置cookie: setcookie('username',$username,time()+3600,'/user/', ...
- magento问题集3
MISSING LANGUAGE FILES OR DIRECTORIES A:已经装了俄语包,也是russian目录,在前台也可以用.但是在后台最上面总是显示MISSING LANGUAGE FIL ...
- (Foundation)NSObject 、 NSString 、 NSMutableString
1 重构Student和Book类 1.1 问题 本案例需要创建一个Book类,类中有一个整型price属性,用于记录书的价格.还需要创建一个Student类,类中有两个带参属性,它们是整型的年龄ag ...
- yii弹出层
Yii弹出层,包装了JQuery的JDialog,使用很方便.Yii组件功能太强大,强大到无法自拔 $this->beginWidget('zii.widgets.jui.CJuiDialog' ...
- 正则表达式 regular expression
原博客地址:http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html