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

  • 相关阅读:
    Python编程题32最小栈
    Python编程题31用列表实现队列
    Python编程题34用队列实现栈
    Python编程题40验证字母表的顺序
    Python编程题36三个数的最大乘积
    Python编程题39所有奇数长度子列表的和
    RTX 3090的深度学习环境配置指南:Pytorch、TensorFlow、Keras。配置显卡
    python numpy实现SVD 矩阵分解
    linux安装tomcat部署静态网页
    python使用deepwalk模型算节点相似度
  • 原文地址:https://www.cnblogs.com/fps2tao/p/15576969.html
Copyright © 2011-2022 走看看