C# 从不是创建控件 的线程访问它

有两种方式解决 
1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;
2.使用Invoke等委托函数。

问题原因是。net2.0以后拒绝多线程访问空间,避免空间造成死锁。以前Control.CheckForIllegalCrossThreadCalls =false;默认就是这样,现在默认为true。
如果不会好几个线程同时操作一个控件用方法1就可以。如果存在多个线程一起操作控件使用方法2

例如: this.progressBar1.Maximum = max;

改为:this.setMaxProcess(_totalFrames);

        private delegate void MyDelegate(int maxnum);

        private void setMaxProcess(int max)
        {
            if (this.progressBar1.InvokeRequired)
            {
                MyDelegate del = new MyDelegate(setMaxProcess);
                this.Invoke(del, new object[] { max });
            }
            else
                this.progressBar1.Maximum = max;
        }
时间: 2024-11-29 13:06:22

C# 从不是创建控件 的线程访问它的相关文章

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

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

[Winform]线程间操作无效,从不是创建控件的线程访问它的几个解决方案,async和await?

目录 概述 取消跨线程检查 使用委托异步调用 sync和await 总结 概述 最近在qq群里有一朋友,问起在winform中怎么通过开启线程的方式去处理耗时的操作,比如,查看某个目录下所有的文件,或者符合要求的文件.下班回来,也研究了一下.发现多线程这块有点薄弱,也算是补一补吧. 在winform开发,经常会遇到需要在控件上加载大量数据(也就是常说的耗时操作),这会导致程序出现假死状态,这个时候我们就会想到线程. 在智能客户端应用程序中,这样的线程创建并管理用户界面 (UI),因而称为 UI

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

题目:在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) => {

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

访问 Windows 窗体控件本质上不是线程安全的.如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用情况和死锁.确保以线程安全方式访问控件非常重要. 解决办法 1.把CheckForIllegalCrossThreadCalls设置为false 在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,可以在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为

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

原文: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

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

public partial class Form1 : Form     {         private delegate void DelegateSetText(string text);         private void SetText(string text)         {             if (this.txtMessage.InvokeRequired)             {                 Invoke(new DelegateS

线程间操作无效: 从不是创建控件&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);