有两种方式解决 1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false; 2.使用Invoke等委托函数。 问题原因是。net2.0以后拒绝多线程访问空间,避免空间造成死锁。以前Control.CheckForIllegalCrossThreadCalls =false;默认就是这样,现在默认为true。 如果不会好几个线程同时操作一个控件用方法1就可以。如果存在多个线程一起操作控件使用方法2 方法2可以 Invoke(new MethodInvoker(delegate() { //do something... }));
我们在用线程操作的时候,可能会出现异常:线程间操作无效: 从不是创建控件richTextBox1的线程访问它。因为windows窗体控件不是线程安全的,如果几个线程操作某一控件的状态,可能会使该控件的状态不一致,出现争用或死锁状态。这种情况有以下解决办法: 1. 可以在load时将CheckForIllegalCrossThreadCalls 属性的值设置为 false 。这样进行非安全线程访问时,运行环境就不去检验它是否是线程安全的。但是不推荐这种方法。 2. 利用委托机制实现线程安全。第二种方法就是微软建议采用的跨线程调用的一种通用方法,就是使用代理来实现,就是将你所要操作的代码放到一个代理中,然后将这个代理交给创建这个控件的线程来执行你的代码。 [c-sharp] view plaincopy private delegate void richTextBoxCallBack(); //建立一个委托 public void server() { richTextBoxCallBack callback = delegate()//使用委托 { string ip = getIP();//得到ip地址 try { //获取txt文件的端口号 StreamReader smReader = new StreamReader(path, System.Text.Encoding.UTF8);//设置路径 string line; while ((line = smReader.ReadLine()) != null) { //string[] arrStr = line.Split('|'); //分割符 “|” port = Int32.Parse(line.Trim().ToString()); // MessageBox.Show(port.ToString()); } smReader.Close(); smReader.Dispose(); IPAddress ipAddress = IPAddress.Parse(ip); //创建服务器的套接字 listener = new TcpListener(ipAddress, port); //开始监听服务器端口 listener.Start(13); //打出提示的信息 this.richTextBox1.AppendText("Socket服务器已经启动,正在监听IP" + ip + " 端口号:" + port + "/n"); //从不是创建它的线程访问它的错误??? //启动一个新的线程,执行方法this.StartSocketListen, //以便在一个独立的进程中执行确认与客户端Socket连接的操作 SocketServiceFlag = true;//服务开始 Thread thread = new Thread(new ThreadStart(this.StartSocketListen)); thread.Start(); this.button1.Enabled = false; this.button2.Enabled = true; } catch (Exception ex) { MessageBox.Show("服务器启动错误!!" + ex.Message); } }; richTextBox1.Invoke(callback); } 建立一个委托 private delegate void richTextBoxCallBack(); 然后使用委托 richTextBoxCallBack callback = delegate(){}; //使用委托, 声明一个委托类型的变量callback ,{}之间的代码还是原来的方法的代码,最后richTextBox1.Invoke(callback);完成对该控件委托调用
线程间操作无效: 从不是创建控件“”的线程访问它。 听说2003里边不会,我不知道是不是这样的,反正一直都在用05~ 05里会出这个问题的,貌似是为了安全~ 哦,现在知道的解决方法有两个~ 第一: Control.CheckForIllegalCrossThreadCalls = false; 线程开始的时候加这么一句,OK,看不到错误了~ 啥都能用了~ 第二: 用委托,在05里,每个控件都有个InvokeRequired的属性~ 判断一下是不是true,是的话进行Invoke操作的,完事了~ //建立个委托 private delegate string returnStrDelegate(); //搞个最简单滴取值滴方法~ private string returnSchool() { return CB_School.SelectedValue.ToString(); } //判断一下是不是该用Invoke滴~,不是就直接返回~ private string returnCB(returnStrDelegate myDelegate) { if (this.InvokeRequired) { return (string)this.Invoke(myDelegate); } else { return myDelegate(); } } //别的线程里的调用哇~ string _school = returnCB(returnSchool); 大概就是这样的,貌似有听说最好别用第一种方法,具体为啥我也不知道~ 反正我一直都用委托的,也不是很麻烦~
相关推荐
文档中讲解了C#中在使用多线程,跨线程操作时报错“线程间操作无效: 从不是创建控件“…”的线程访问它”的解决办法。
在.NET框架中,尤其是使用C#进行Windows Forms或WPF应用程序开发时,会遇到一个常见的错误:“线程间操作无效:从不是创建控件“textBox1”的线程访问它”。这个错误是由于线程同步问题引起的,特别是当尝试在非UI...
然而,线程间操作(Thread Interoperability)如果没有正确处理,可能会引发“线程间操作无效”(Invalid Cross-thread Access)异常。这个异常通常发生在UI线程与非UI线程尝试交互时,尤其是当非UI线程试图修改UI...
- Control.Dispenser:VS2008引入了一个名为Control.Dispenser的工具,它可以帮助管理控件的跨线程访问,但该功能在后续版本中被弃用。 - SynchronizationContext:.NET框架提供了一个抽象类SynchronizationContext...
跨线程操作是指从一个线程访问另一个线程创建的控件或资源。然而,在 Winform 中,默认情况下是不允许跨线程操作的。这是因为在 Winform 中,每个控件都有其所属的线程,这些控件只能被其所属线程访问。如果从另一个...
描述中提到的错误“线程间操作无效 从不是创建控件“___”的线程访问它”是.NET Framework中常见的一个异常,提示我们不能直接从非UI线程(工作线程)修改UI元素,因为这违反了Windows消息模型。 在Windows应用中,...
在VB.NET中,非UI线程直接修改UI控件属性会导致“线程间操作无效”的错误。这是因为控件是在主线程中创建的,必须在同一个线程中进行操作。解决这个问题有以下几种方法: 1. **控件的Invoke或BeginInvoke方法**:这...
为了实现跨线程访问控件,.NET Framework为每个控件 提供了InvokeRequired属性和Invoke方法。使用这些技 巧,就可以实现我们在其他线程中直接修改界面的需要 InvokeHelper类中实现了多线程 操作窗口控件, 学习多...
为了实现跨线程访问控件,.NET Framework为每个控件 提供了InvokeRequired属性和Invoke方法。使用这些技 巧,就可以实现我们在其他线程中直接修改界面的需要 InvokeHelper类中实现了多线程 操作窗口控件, 学习多...
但直接访问会出现“线程间操作无效”的情况,因为.NET禁止了跨线程调用控件, 否则谁都可以操作控件,最后可能造成错误。 下面介绍几种跨线程访问的方法: 1、禁止对跨线程访问做检查 (不推荐使用这种方法) 这种...
总结来说,C#的WinForm跨线程访问控件的关键在于使用`Control.BeginInvoke`方法,它允许你在非UI线程上安排在UI线程上执行的代码。通过定义适当的委托并利用辅助类,你可以安全地更新任何窗体或控件的状态,而不会...
线程间操作无效 从不是创建控件“textBox1”的线程访问它的多种解法 环境:Visual Studio 2012 语言:C# 如有错误,请指正 如有疑问,请留言 与君共勉,共同进步! 给个赞就是对我最大的肯定!
当在MFC项目中使用串口通信时,如果不正确地配置或使用,可能会遇到“Debug Assertion Failed”的错误提示,这通常意味着代码在执行过程中遇到了未预期的情况,比如试图访问无效的内存地址或尝试执行非法操作。...
6. **多线程支持**:为了提高性能,邮件操作(如发送、下载)可能在后台线程中执行,不影响主线程的响应,使得用户体验更加流畅。 7. **错误处理和异常处理**:良好的Mail控件库会提供完善的错误处理机制,捕获并...
4. 视图状态(ViewState):理解视图状态的工作原理,它是ASP.NET中保持控件状态的关键机制。 5. 控制器状态(ControlState):与视图状态类似,但不受页面回发影响,用于存储必要的控件配置信息。 6. URL路由:使用...
C++Builder是一个强大的开发工具,它提供了一个集成的开发环境,其中包含了VCL(可视化组件库),专门用于构建Windows应用程序。文档中分为几个主要部分,每个部分都针对特定的问题提出了建议和解决方案。 **...
当从非UI线程尝试访问UI控件时,`InvokeRequired`会检查当前线程是否是控件的所有者线程,如果不是,则需要通过`Invoke`或`BeginInvoke`方法来调度操作。 标题“InvokeRequired-NoNeed-Thread-Safe”暗示了一种方法...
7. 窗体属性:`Enabled`属性为False时,窗体及其控件将变得不可交互,用户操作无效。 8. 存储单位:在计算机中,1024K才是1M,而不是1000K。 9. 输入掩码:“掩码 LLLO00”表明允许输入两位字母后跟三位数字,所以...
当尝试在一个非 UI 线程中访问 UI 控件时,会触发异常:“线程间操作无效”。为了避免这种情况,可以使用委托来更新 UI 元素: ```vbnet Delegate Sub Dg(ByVal v As Int32) Sub abc() For n = 0 To ...