"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"
来源:互联网 发布:董云飞老师网络公开课 编辑:程序博客网 时间:2024/04/20 13:23
文章出处:http://www.cnblogs.com/hsapphire/archive/2010/10/21/1857421.html
哎,有接近半年的时候没有真正的写c#程序了,这段时间都写C程序了,看了看UCOS II,有好多不懂的地方,还得挤出时间多看看,看多了不懂的地方就少了。废话好想说多了(老了吧)。
今天下午就遇到了这么个问题。其实以前写程序也遇到过,按照以前的解决方法还是没有解决。
以前的解决办法(这是网上找的):
“在Window窗体程序开发的时候,如果使用多线程编程,在子线程中访问主线程窗体内的控件,就需要使用控件的Control.Invoke方法或者BeginInvoke方法。但是有时候因为Window执行速度太快,尤其是你写代码的时候在InitializeComponent();完成之前起了一个线程去执行某些操作,涉及到窗体控件的,当你在调用Control.Invoke的时候,就可能出现 “在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”错误。
解决的办法就是让线程等待,直到窗口句柄创建完毕:
//防止在窗口句柄初始化之前就走到下面的代码
while (!this.IsHandleCreated)
{
;
}
this.BeginInvoke(new ProListIndexChangedDelegate(GetProLyric));
//根据不同情况也可以:
if (this.IsHandleCreated)
BeginInvoke(new ProListIndexChangedDelegate(GetProLyric));
”
//--------------------------------------------------------------------
我的程序是这样的:
Form1有Button1、Button2和Button3两个按钮,Button2是动态的new Form2窗体,Form2中注册了Form1中的事件.
Button1的作用是关闭所有new出来的Form2窗体,并且把其资源释放掉(Dispose()).
Button3是让Form2中注册Form1了的事件都发生。
操作:
先点Button2 new出几个Form2的窗体,然后点击Button1释放掉所有的资源,然后再单击Button2 new出几个Form2的窗体,再单击Button3问题就出现了。老是提示"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"。
查找问题:
再次新建窗体的窗口句柄在Show()之后都通过IsHandleCreated属性检测过了,再调用Invoke()之前都创建了,还是会出错。那问题出在哪里呢?一开始还以为单击Button1没有真正的释放资源,然后我就强制GC了,然后检测不到以前的窗体了,但是还是不行,还是有问题。
然后就想到了“事件”上面来了。是不是事件的原因呀?以前创建的窗体没有注销该事件,把之前所有的窗体都注销该事件,问题就解决了......
注:以下是文章出处的回复,此方法经本人尝试,可行!
- 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
- 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
- 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke 解决
- [ 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。]错误的处理
- 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
- TCP Socket 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
- TCP Socket 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
- "在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"
- "在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"
- 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
- 在创建窗口句柄之前 不能在控件上调用 Invoke 或 BeginInvoke
- 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
- "在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"
- sql server 2008 创建窗口句柄之前不能在控件上调用invoke或begininvoke
- 安装SQL Server出现在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke的错误解决办法
- MSSQL Server 2008安装失败: 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
- MSSQL Server 2008卸载失败: 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
- SQL Server 2008安装程序失败在创建窗口句柄之前不能在控件上调用 Invoke 或 BeginInvoke
- C语言连接MySql数据库(CodeBlocks)
- maven 配置篇 之pom.xml(一)
- Azkaban源码阅读之CachingFlowManager
- 黑马程序员-做一个像文本档一样的小软件
- maven 配置篇 之pom.xml(二)
- "在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"
- 随想-提高班ING
- ios中数据存储的四种方式
- 1000
- ubuntu修改interfaces for network
- vim快捷键高级用法
- broadcast
- C++ string format的时候出错
- SQL 语句大全