zoukankan      html  css  js  c++  java
  • 解决关闭窗口,C#报错"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"

    情况:在C#开发的过程中多线程委托是经常用的,今天在测试以前写的软件的时候发现有个问题,报 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。 这样的错误。

    解决方法:加上 if (this.IsHandleCreated)

    1、首先分析问题,
    句柄:是对象的引用名,存于栈区(可以理解为对象的指针),对象是存于堆区,通过操控栈区的引用名来操控对象。
    控件上调用 Invoke 或 BeginInvoke的作用:由于C#是是强制类型安全的,当调用方线程与控件的线程(一般位于主线程)不在同一个线程,则调用方需要使用Invoke 或 BeginInvoke方法来间接委托的使用主线程的控件。

    报错显示“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”
    说明在当前控件的容器窗口并关闭了,应该是使用鼠标关掉了一个子窗口,不存在了(栈中保存的该窗体引用名被清除), 但是该程序包含多个窗口,关掉了一个窗口,程序还是在运行,但是在程序中的一个线程还想使用关掉的窗体上的控件,窗体关闭了,其包含的控件对象也消失了,因此报错。很可能是窗体关闭了,但是其线程还未执行完成消失。

    2、这显然是线程不知道该控件已经消失了,还继续使用它造成的错误,因此我们在程序中添加 **if (this.IsHandleCreated)**判断窗体或控件的句柄是否还存在,之后才使用控件。

    在调用下一个委托的时候。先判断下 在控件上面或者窗体上 IsHandleCreated ,如下:

    if (this.IsHandleCreated)
    {
        Methinvoker meth = new Methinvoker(MessSeInfo);
         this.BeginInvoke(meth);
    }

    转 : https://blog.csdn.net/qq_37271216/article/details/98857645

  • 相关阅读:
    POJ 3258 (NOIP2015 D2T1跳石头)
    POJ 3122 二分
    POJ 3104 二分
    POJ 1995 快速幂
    409. Longest Palindrome
    389. Find the Difference
    381. Insert Delete GetRandom O(1)
    380. Insert Delete GetRandom O(1)
    355. Design Twitter
    347. Top K Frequent Elements (sort map)
  • 原文地址:https://www.cnblogs.com/fps2tao/p/15576969.html
Copyright © 2011-2022 走看看