解决关闭窗口,C#报错"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"

摘要:
对控件调用Invoke或BeginInvoke的函数:因为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

免责声明:文章转载自《解决关闭窗口,C#报错"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NFS(网络文件系统)记录一下iOS Leak的使用方法。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Win 10应用开发】多窗口视图

Windows App一般情况下,同一时刻只能有一个应用程序实例在运行,为了在特殊需求下可以同时呈现不同的UI,SDK提供了多视图操作支持。 应用程序可以创建新的应用视图,以新的视图为基础可以呈现与主视图不同的内容,但又不影响主视图的UI。这些视图既可以在同一个窗口中切换,也可以用新的窗口来呈现新的视图。这些窗口,用户可以拖放到不同的虚拟桌面中。 其实,视...

CDHtmlDialog探索----Javascript与窗体交互

CDHtmlDialog探索----Javascript与窗体交互 CDHtmlDialog提供了C++与网页的双向交互,通此一系统简单的宏调用可以把网页中各元素的事件直接映射到C++程序中,而在网页中调用C++功能代码就显的不那么直观了。归根结底交互的基理就是实现相应COM接口。实现方式如下: 1、在窗体初始化时调用EnableAutomation函数...

C# 加载C++创建的动态链接库dll

创建dll 1.打开vs,点击文件-->新建-->项目。 2.选择C++下面的windows桌面,右边选择动态链接库(DLL)。新建成功之后,默认为x86平台。 按照你自己的需求更换平台,必须调用的和被调用的dll同为一个平台。 3.新建之后,在头文件中添加mydll.h,内容为: #define DLL_API extern "C" _de...

多线程详细介绍

什么是进程线程:我们来看一下自己的任务管理器 这里的每一项都是一个进程,我们的发布的每一个应用程序都需要一个进程去运行,在一个进程内可以有多个线程去计算执行程序。我们看下面的图片: 我们可以看一下进程和线程的数量,很明显可以看出,线程和进程的关系。我们的每一个操作都需要一个线程来执行,鼠标的点击就需要线程去响应我们的操作。 现在我们不难理解,我们一个应...

C#锐利体验(转)

南京邮电学院 李建忠(cornyfield@263.net) 索引 C#锐利体验 "Hello,World!"程序 C#语言基础介绍 Microsoft.NET平台基础构造 类与对象 构造器与析构器 方法 域与属性 索引器与操...

多线程调用有参数的方法---c# Thread 与 Task

  C#实现多线程的方式:Task——任务       简介   .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能。 在后台使用ThreadPool。 任务表示应完成的某个单元的工作。 这个单元的工作可以在单独的线程中运行,也可以以同步方式启动一个任务,这需要等待主调线程。 使用任务不仅可以获得一个抽象...