解决多线程操作控件时可能出现的异常:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
2005-10-25 14:47
831 查看
.NET Framework 中关于“多线程 Windows 窗体控件示例”的一些摘要:
------------------------------------------------------
“Windows 窗体”使用单线程单元 (STA) 模型,因为“Windows 窗体”基于本机 Win32 窗口,而 Win32 窗口从本质上而言是单元线程。STA 模型意味着可以在任何线程上创建窗口,但窗口一旦创建后就不能切换线程,并且对它的所有函数调用都必须在其创建线程上发生。除了 Windows 窗体之外,.NET Framework 中的类使用自由线程模型。有关 .NET Framework 中的线程的信息,请参见线程处理。
STA 模型要求需从控件的非创建线程调用的控件上的任何方法必须被封送到(在其上执行)该控件的创建线程。基类 Control 为此目的提供了若干方法(Invoke、BeginInvoke 和 EndInvoke)。Invoke 生成同步方法调用;BeginInvoke 生成异步方法调用。
如果您在控件中为大量占用资源的任务使用多线程,则用户界面可以在背景线程上执行一个大量占用资源的计算的同时保持可响应。
------------------------------------------------------
下面直接给出我的实例程序,一个按钮是非创建线程直接调用 DataGrid 控件的数据绑定,将抛出异常;
另一个按钮是通过 Invoke 调用,将成功执行。
using System;
using System.Data;
using System.Threading;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace MultiThreadOperateControls
示例下载:http://files.cnblogs.com/HQT/MultiThreadOperateControls.rar
------------------------------------------------------
“Windows 窗体”使用单线程单元 (STA) 模型,因为“Windows 窗体”基于本机 Win32 窗口,而 Win32 窗口从本质上而言是单元线程。STA 模型意味着可以在任何线程上创建窗口,但窗口一旦创建后就不能切换线程,并且对它的所有函数调用都必须在其创建线程上发生。除了 Windows 窗体之外,.NET Framework 中的类使用自由线程模型。有关 .NET Framework 中的线程的信息,请参见线程处理。
STA 模型要求需从控件的非创建线程调用的控件上的任何方法必须被封送到(在其上执行)该控件的创建线程。基类 Control 为此目的提供了若干方法(Invoke、BeginInvoke 和 EndInvoke)。Invoke 生成同步方法调用;BeginInvoke 生成异步方法调用。
如果您在控件中为大量占用资源的任务使用多线程,则用户界面可以在背景线程上执行一个大量占用资源的计算的同时保持可响应。
------------------------------------------------------
下面直接给出我的实例程序,一个按钮是非创建线程直接调用 DataGrid 控件的数据绑定,将抛出异常;
另一个按钮是通过 Invoke 调用,将成功执行。
using System;
using System.Data;
using System.Threading;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace MultiThreadOperateControls
示例下载:http://files.cnblogs.com/HQT/MultiThreadOperateControls.rar
相关文章推荐
- 解决多线程操作控件时可能出现的异常:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
- 决多线程操作控件时可能出现的异常:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
- 解决 在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级
- [vb.net]解决 "在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级"
- 在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
- 某个线程上创建的控件不能成为在另一个线程上创建的控件的父级(转)
- 错误:在一个线程上创建的控件不能成为在另一个线程控件的父级(处理方法)
- 使用线程加载控件,通过delegate创建控件,但仍报错“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
- 在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级
- WinForm解决多线程操作控件问题 线程间操作无效: 从不是创建控件的线程访问它"
- 多线程委托之跨线程问题分析--在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(解决方法已更新)
- Delphi中多线程用Synchronize实现VCL数据同步显示 解决在线程中操作控件出现问题
- C# 线程操作 出现“从不是创建控件lstUser的线程访问它”错误的解决方法
- 线程中设置窗体控件的值出现异常(线程间操作无效: 从不是创建控件“textBox1”的线程访问它)
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- 黄聪:C#“多线程线程间操作无效: 从不是创建控件的线程访问它。”,跨线程修改控件属性解决方案
- 其他信息: 线程间操作无效: 从不是创建控件“stateLabel”的线程访问它。解决办法
- 转:线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- 解决"线程间操作无效: 从不是创建控件的线程访问它"
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法