"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"

Posted asdyzh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"相关的知识,希望对你有一定的参考价值。

以前的解决办法(这是网上找的):

“在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了,然后检测不到以前的窗体了,但是还是不行,还是有问题。

然后就想到了“事件”上面来了。是不是事件的原因呀?以前创建的窗体没有注销该事件,把之前所有的窗体都注销该事件,问题就解决了......

 

https://www.cnblogs.com/hsapphire/archive/2010/10/21/1857421.html









以上是关于"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"的主要内容,如果未能解决你的问题,请参考以下文章

c#,求助!在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

在创建窗口句柄之前,不能对控件调用 Invoke 或 BeginInvoke

SQL 2008 management studio安装时出现错误:在创建窗口句柄之前,不能在控件上调用InVoke或BeginInvoke

vb 获取窗口句柄

vb 知道窗口句柄以及怎样获得窗口上文本框和按钮句柄并传递信息