`
灵雨飘零
  • 浏览: 35103 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
文章分类
社区版块
存档分类
最新评论

线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析

 
阅读更多

最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时,遇到这样的问题,

错误显示:

未处理的“System.InvalidOperationException”类型的异常出现在 System.Windows.Forms.dll 中。

其他信息: 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。

以前很少做关于线程的程序,而且对于线程的理解也不是很深,无奈只好百度之。很快从网上找到了解决方案:

方法1、在Form Load事件中加入


System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
这是是最简单的方式!

方法二、使用Invoke调用委托

参考示例代码:


1.定义 委托
delegatevoidmyDelegate(inti);
myDelegatemydelegate
=null;

2.定义方法,显示消息

publicvoidShowMessage(inti)
{
this.textBox1.Text=i.ToString();
this.progressBar1.Value=i;
}



3.定义方法,驱动消息

publicvoidMyEvent()
{
for(inti=0;i<100;i++)
{
Thread.Sleep(
100);
this.BeginInvoke(mydelegate,newobject[]{i});

}
}



4: 运行
privatevoidbutton1_Click(objectsender,EventArgse)
{
mydelegate
=newmyDelegate(ShowMessage);
ThreadmyThread
=newThread(MyEvent);

//IsBackground是否后台
//这个属性很重要.如果ThreadIsBackground等于false
//当线程还没有结束时,你点了关闭按钮
//将抛出Anunhandledexception
//oftype'System.InvalidOperationException'
//occurredinSystem.Windows.Forms.dll异常
myThread.IsBackground=true;
myThread.Start();
}

问题分析:

根据错误提示,可知在调试器中运行应用程序时,如果不是控件的创建者线程试图调用该控件时,则调试器会引发 InvalidOperationException,并提示消息:“从不是创建控件 Control Name 的线程访问它。”说白了,就是资源访问的不一致性,控件的调用者线程不是控件的创建者线程,这是.net实现资源安全访问机制的必然结果。访问 Windows 窗体控件本质上不是线程安全的。如果多个线程同时操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。

更详细的解释请参看:

http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx?mfr=true

分享到:
评论

相关推荐

    C#线程间操作无效Study

    然而,线程间操作(Thread Interoperability)如果没有正确处理,可能会引发“线程间操作无效”(Invalid Cross-thread Access)异常。这个异常通常发生在UI线程与非UI线程尝试交互时,尤其是当非UI线程试图修改UI...

    c#跨线程间控件调用

    例如,在调试模式下,如果某个线程尝试访问并非由它创建的控件,.NET Framework 的调试器会抛出 `InvalidOperationException` 异常,并给出明确的错误信息:“从不是创建控件controlname的线程访问它。”这有助于...

    如何:对Windows 窗体控件进行线程安全调用

    在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,并提示消息:“从不是创建控件 control name 的线程访问它。” 此异常在调试期间和...

    线程相关可根据自定义的线程名字进行操作.zip

    在C#编程中,线程是程序执行的基本单元,它允许程序同时执行多个任务,显著提高了应用程序的效率和响应性。本项目“线程相关可根据自定义的线程名字进行操作.zip”着重于如何根据线程的名字来管理和操作线程,特别是...

    Winform调用WPF控件

    2. 创建WPF用户控件:在WPF项目中,创建一个新的UserControl,并在其中添加DataGrid控件。配置DataGrid的列、样式和数据绑定等属性。 ```xml &lt;!-- WPF UserControl XAML --&gt; &lt;UserControl x:Class="WpfControls....

    精彩编程与编程技巧-如何在VB中使用Delphi的控件...

    Delphi 是一种基于Object Pascal的快速应用开发工具,它内置了大量的VCL控件库,这些控件不仅功能强大而且易于使用,可以帮助开发者快速构建功能丰富的Windows应用程序。VCL提供了从基本的按钮、文本框到高级的图表...

    Visual C# 控件操作代码

    在Visual C#编程环境中,控件操作是构建用户界面(UI)的核心部分。控件是屏幕上可视元素,如按钮、文本框、复选框等,它们允许用户与应用程序交互。本篇文章将深入探讨Visual C#中对控件进行操作的各种代码实现,...

    基于mfc实现控件添加和修改

    在Windows应用程序开发中,Microsoft Foundation Class (MFC) 库是一个强大的工具,它为开发者提供了构建桌面应用程序的C++类库。本主题将深入探讨如何使用MFC来实现控件的添加与修改,特别是针对“个人信息”管理的...

    MFC连接SqlServer数据库,并将查询的数据显示到listCtrl控件上

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来连接SQL Server数据库,并将查询结果展示在List Control(listCtrl)控件上。MFC是Microsoft为Windows应用程序开发提供的一种C++类库,它...

    用WPF自制的漂亮时钟控件

    总结来说,利用WPF创建一个漂亮的时钟控件是一个很好的学习项目,它将涉及UI设计、数据绑定、定时器操作和自定义控件开发等多个方面。通过这样的实践,开发者可以提高自己的WPF技能,同时创造出独特且具有实用性的...

    C#控件一览表

    ### C#控件一览表详解 #### 一、窗体属性与方法概览 本文将深入探讨C#中窗体的一些重要属性与方法,帮助开发者更好地理解和应用这些基础概念。 ##### 1. 常用属性 - **Name属性**:窗体的名称,用于在代码中唯一...

    Delphi XE通过句柄获取其他程序控件中的内容

    const ControlClass, ControlName: string): HWND; var ChildHandle: HWND; begin Result := 0; ChildHandle := FindWindowEx(ParentHandle, 0, PChar(ControlClass), PChar(ControlName)); if ChildHandle &lt;&gt; ...

    WPF调用Winform 的控件和源码

    如果遇到跨线程操作的问题,可以使用`Control.Invoke`或`Control.BeginInvoke`方法。 至于源码部分,压缩包中应该包含了一个演示如何在WPF中嵌入和操作WinForms控件的示例项目。这个项目可能包括了创建WPF窗口、...

    SerialPort控件的使用

    随着.NET Framework的发展和技术的更新迭代,Visual Studio 6.0中广泛使用的Microsoft Communication Control (MSComm) 控件已不再适用于现代.NET开发环境。Visual Studio 2005及之后版本引入了新的SerialPort类,...

    VB用户控件制作.doc

    在VB编程环境中,用户控件(User Control)是一种自定义的可视化组件,允许开发者根据特定需求创建功能丰富的控件。用户控件的制作涉及到属性、事件和方法的定义,以及保存和读取用户设置,以及利用各种技术实现预定...

    C#学习手册3

    - **跨线程访问**:.NET 中默认不允许不同线程间访问 UI 元素,可通过设置 `Control.CheckForIllegalCrossThreadCalls` 为 `false` 来禁用此检查。 #### MessageBox 使用 - **函数**:`MessageBox` 用于显示警告、...

    使用串口控件-vb.net.doc

    在实际应用中,除了基本的串口配置和数据收发,还需要考虑错误处理、线程安全、流控制等问题。比如,当串口数据接收频繁时,可能需要使用线程池或异步编程来避免阻塞主线程。此外,还可以通过添加按钮或菜单项来控制...

    VB线程枚举窗体,当前打开的所有窗体

    VB提供了`Control.Invoke`或`Control.BeginInvoke`方法来保证UI线程的安全操作。例如,当你需要更新UI控件(如Label或TextBox)时,你应该在UI线程上执行这些操作: ```vb Dim updateUI As New Action(Of String)...

    Threading in C#

    - **公寓模型(Apartments)和Windows Forms**: Windows Forms控件通常只能在创建它们的线程上访问。 - **Control.Invoke**: 在Windows Forms中用于在UI线程上调用委托。 - **BackgroundWorker**: 提供了一种简单的...

Global site tag (gtag.js) - Google Analytics