最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时,遇到这样的问题,
错误显示:
未处理的“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
分享到:
相关推荐
然而,线程间操作(Thread Interoperability)如果没有正确处理,可能会引发“线程间操作无效”(Invalid Cross-thread Access)异常。这个异常通常发生在UI线程与非UI线程尝试交互时,尤其是当非UI线程试图修改UI...
例如,在调试模式下,如果某个线程尝试访问并非由它创建的控件,.NET Framework 的调试器会抛出 `InvalidOperationException` 异常,并给出明确的错误信息:“从不是创建控件controlname的线程访问它。”这有助于...
在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,并提示消息:“从不是创建控件 control name 的线程访问它。” 此异常在调试期间和...
在C#编程中,线程是程序执行的基本单元,它允许程序同时执行多个任务,显著提高了应用程序的效率和响应性。本项目“线程相关可根据自定义的线程名字进行操作.zip”着重于如何根据线程的名字来管理和操作线程,特别是...
2. 创建WPF用户控件:在WPF项目中,创建一个新的UserControl,并在其中添加DataGrid控件。配置DataGrid的列、样式和数据绑定等属性。 ```xml <!-- WPF UserControl XAML --> <UserControl x:Class="WpfControls....
Delphi 是一种基于Object Pascal的快速应用开发工具,它内置了大量的VCL控件库,这些控件不仅功能强大而且易于使用,可以帮助开发者快速构建功能丰富的Windows应用程序。VCL提供了从基本的按钮、文本框到高级的图表...
在Visual C#编程环境中,控件操作是构建用户界面(UI)的核心部分。控件是屏幕上可视元素,如按钮、文本框、复选框等,它们允许用户与应用程序交互。本篇文章将深入探讨Visual C#中对控件进行操作的各种代码实现,...
在Windows应用程序开发中,Microsoft Foundation Class (MFC) 库是一个强大的工具,它为开发者提供了构建桌面应用程序的C++类库。本主题将深入探讨如何使用MFC来实现控件的添加与修改,特别是针对“个人信息”管理的...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来连接SQL Server数据库,并将查询结果展示在List Control(listCtrl)控件上。MFC是Microsoft为Windows应用程序开发提供的一种C++类库,它...
总结来说,利用WPF创建一个漂亮的时钟控件是一个很好的学习项目,它将涉及UI设计、数据绑定、定时器操作和自定义控件开发等多个方面。通过这样的实践,开发者可以提高自己的WPF技能,同时创造出独特且具有实用性的...
### C#控件一览表详解 #### 一、窗体属性与方法概览 本文将深入探讨C#中窗体的一些重要属性与方法,帮助开发者更好地理解和应用这些基础概念。 ##### 1. 常用属性 - **Name属性**:窗体的名称,用于在代码中唯一...
const ControlClass, ControlName: string): HWND; var ChildHandle: HWND; begin Result := 0; ChildHandle := FindWindowEx(ParentHandle, 0, PChar(ControlClass), PChar(ControlName)); if ChildHandle <> ...
如果遇到跨线程操作的问题,可以使用`Control.Invoke`或`Control.BeginInvoke`方法。 至于源码部分,压缩包中应该包含了一个演示如何在WPF中嵌入和操作WinForms控件的示例项目。这个项目可能包括了创建WPF窗口、...
随着.NET Framework的发展和技术的更新迭代,Visual Studio 6.0中广泛使用的Microsoft Communication Control (MSComm) 控件已不再适用于现代.NET开发环境。Visual Studio 2005及之后版本引入了新的SerialPort类,...
在VB编程环境中,用户控件(User Control)是一种自定义的可视化组件,允许开发者根据特定需求创建功能丰富的控件。用户控件的制作涉及到属性、事件和方法的定义,以及保存和读取用户设置,以及利用各种技术实现预定...
- **跨线程访问**:.NET 中默认不允许不同线程间访问 UI 元素,可通过设置 `Control.CheckForIllegalCrossThreadCalls` 为 `false` 来禁用此检查。 #### MessageBox 使用 - **函数**:`MessageBox` 用于显示警告、...
在实际应用中,除了基本的串口配置和数据收发,还需要考虑错误处理、线程安全、流控制等问题。比如,当串口数据接收频繁时,可能需要使用线程池或异步编程来避免阻塞主线程。此外,还可以通过添加按钮或菜单项来控制...
在MFC(Microsoft Foundation Classes)开发中,遇到的问题多种多样,但主要集中在控件的使用和常见错误的处理。以下是一些关键知识点的详细解释: 1. **属性页的添加**: MFC中,属性页是通过`CPropertyPage`类...
VB提供了`Control.Invoke`或`Control.BeginInvoke`方法来保证UI线程的安全操作。例如,当你需要更新UI控件(如Label或TextBox)时,你应该在UI线程上执行这些操作: ```vb Dim updateUI As New Action(Of String)...