解決關閉窗口,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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM