线程间操作无效: 从不是创建控件的线程访问它

public partial class Form1 : Form
    {
        private delegate void DelegateSetText(string text);
        private void SetText(string text)
        {
            if (this.txtMessage.InvokeRequired)
            {
                Invoke(new DelegateSetText(SetText), text);
            }
            else
            {
                this.txtMessage.Text += text;
            }

        }

        public Form1()
        {
            InitializeComponent();
            //Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            var t = Task.Factory.StartNew(() =>
            {
                Do();
            });

        }
     private void Do()
        {
            btnTest.Invoke(new MethodInvoker(delegate() { btnTest.Enabled = false; }));
            txtMessage.Invoke(new MethodInvoker(delegate() { txtMessage.Text = ""; }));

            //this.Invoke(new MethodInvoker(() => { btnTest.Enabled = false; }));
            //this.Invoke(new MethodInvoker(() => { txtMessage.Text = ""; }));
            int i = 0;
            while (i < 10)
            {
                string str = DateTime.Now + ":" + i + "\r\n";
                // 简单代码直接写代理
                txtMessage.Invoke(new MethodInvoker(delegate() { this.txtMessage.Text += str; }));
                /////或者使用如下方法,显示声明代理
                //SetText(str);
                Thread.Sleep(1000);
                i++;
            }

            btnTest.Invoke(new MethodInvoker(delegate() { btnTest.Enabled = true; }));
            //this.Invoke(new MethodInvoker(() => { btnTest.Enabled = true; }));

            /*
             this.Invoke(new MethodInvoker(() =>
            {
                btnTest.Enabled = false;
                txtMessage.Text = "";

                int i = 0;
                while (i < 10)
                {
                    string str = DateTime.Now + ":" + i + "\r\n";
                    // 简单代码直接写代理
                    txtMessage.Invoke(new MethodInvoker(delegate() { this.txtMessage.Text += str; }));
                    /////或者使用如下方法,显示声明代理
                    //SetText(str);
                    Thread.Sleep(1000);
                    i++;
                }
                btnTest.Enabled = true;
            }));
            */

        }    
 }
时间: 2024-11-07 07:55:06

线程间操作无效: 从不是创建控件的线程访问它的相关文章

线程间操作无效: 从不是创建控件“”的线程访问它 解决办法(转)

线程间操作无效: 从不是创建控件“”的线程访问它 解决办法 http://blog.sina.com.cn/s/blog_568e66230101der7.html 利用FileSystemWatcher设计一个文件监控系统时,如果一个文件被修改或者新建,则文件修改事件会被多次触发而产生多条信息.为了将一个文件被修改一次而产生的多条信息归结为一条,在设计中新开了一个线程,在指定时间内(如2秒内)这个文件的修改被认为是一次修改,从而只产生一条信息. 这个工作完成后,又出现了另外一个问题:因为需要在

线程间操作无效: 从不是创建控件的线程访问它。

题目:在form窗体中有一个按钮和一个lable.点击按钮创建一个新的线程更新lable的值 1 private void button1_Click(object sender, EventArgs e) 2 { 3 //报错:从不是创建控件的线程访问它 4 Thread t = new Thread(() => 5 { 6 for (int i = 0; i < 100; i++) 7 { 8 this.label1.Text = i.ToString(); 9 } 10 }); 11 t

线程使用中常见的错误-“System.InvalidOperationException”线程间操作无效: 从不是创建控件“ ”的线程访问它。

"System.InvalidOperationException"类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 线程间操作无效: 从不是创建控件"label1"的线程访问它. 解决方法: 1 构造方法中添加 CheckForIllegalCrossThreadCalls = false; 2 方法二 invoke label1.Invoke(new Action<string>((str) => {

线程间操作无效: 从不是创建控件的线程访问它的三种方法

原文:http://www.cnblogs.com/luckboy/archive/2010/12/19/1910785.html 1.把CheckForIllegalCrossThreadCalls设置为false 2.利用委托 delegate void SetTextCallBack(string text); private void SetText(string text) { if (this.txt_a.InvokeRequired) { SetTextCallBack stcb

线程间操作无效: 从不是创建控件&ldquo;textBox2&rdquo;的线程访问它

如何:对 Windows 窗体控件进行线程安全调用 线程间操作无效: 从不是创建控件的线程访问它的三种方法 如果使用多线程处理来提高 Windows 窗体应用程序的性能,则你必须确保以线程安全的方式调用控件. 访问 Windows 窗体控件不是本身就线程安全的. 如果有两个或两个以上线程操作控件的状态,则可能迫使该控件处于不一致状态. 可能出现其他与线程相关的 bug,例如争用条件和死锁. 请务必确保以线程安全的方式访问控件. 详细资料: https://msdn.microsoft.com/z

关于“线程间操作无效: 从不是创建控件’textBox1‘的线程访问它”异常的解决方法

线程间操作无效: 从不是创建控件“textBox1”的线程访问它 背景:通过一个辅助线程计算出的一个值赋给textBox1.text;解决办法:1.直接在窗体的构造函数中加:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 此时把所有的控件 合法性线程检查全部都给禁止掉了. 2.通过代理来解决(msdn) private delegate void SetTextCallback(string text);

线程间操作无效: 从不是创建控件“button1”的线程访问它。

.net2后是不能跨线程访问控件的.,窗体上的控件是当前主线程创建的,当用户异步执行一个方法:在该方法中给窗体上的控件赋值,记住:当执行一个异步委托的时候,其实 就是开了一个线程去执行那个方法,这样就会报错:线程间操作无效: 从不是创建控件“某某某”的线程访问它. C# WinForm开 发中,这是一个比较常见的异常:线程间操作无效,从不是创建控件“xxx”的线程访问它.这个异常来源于.NET2的一个限制:工作线程不能访问窗口线程 创建的控件.解决方法主要有两种,一种是在窗口线程中设置Check

线程间操作无效: 从不是创建控件“控件id”的线程访问它。(.net跨线程执行方法)

找了好久资料,终于解决了,特此记录下来. 1 delegate void DelListHandler(string number); /// <summary> /// 按标识删除listview内容 /// </summary> /// <param name="number">标识</param> private void DelListViewLog(string number) { for (int i = 0; i <

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

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