zoukankan      html  css  js  c++  java
  • "在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"

    哎,有接近半年的时候没有真正的写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了,然后检测不到以前的窗体了,但是还是不行,还是有问题。

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

    作者:水木    

    出处:http://www.hechunbo.com/ 

  • 相关阅读:
    codeforces 455B A Lot of Games(博弈,字典树)
    HDU 4825 Xor Sum(二进制的字典树,数组模拟)
    hdu 1800 Flying to the Mars(简单模拟,string,字符串)
    codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
    codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
    HDU 4148 Length of S(n)(字符串)
    codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
    浅谈sass
    京东楼层案例思维逻辑分析
    浅谈localStorage和sessionStorage
  • 原文地址:https://www.cnblogs.com/grj001/p/12224372.html
Copyright © 2011-2022 走看看