在關閉程序時,會在下面彈出異常
BeginInvoke(new Action(delegate
{
}
解決方法:加上 if (this.IsHandleCreated)
1、首先分析問題,
句柄:是對象的引用名,存於棧區(可以理解為對象的指針),對象是存於堆區,通過操控棧區的引用名來操控對象。
控件上調用 Invoke 或 BeginInvoke的作用:由於C#是是強制類型安全的,當調用方線程與控件的線程(一般位於主線程)不在同一個線程,則調用方需要使用Invoke 或 BeginInvoke方法來間接委托的使用主線程的控件。
報錯顯示“在創建窗口句柄之前,不能在控件上調用 Invoke 或 BeginInvoke”
說明在當前控件的容器窗口並關閉了,應該是使用鼠標關掉了一個子窗口,不存在了(棧中保存的該窗體引用名被清除), 但是該程序包含多個窗口,關掉了一個窗口,程序還是在運行,但是在程序中的一個線程還想使用關掉的窗體上的控件,窗體關閉了,其包含的控件對象也消失了,因此報錯。很可能是窗體關閉了,但是其線程還未執行完成消失。
2、這顯然是線程不知道該控件已經消失了,還繼續使用它造成的錯誤,因此我們在程序中添加 **if (this.IsHandleCreated)**判斷窗體或控件的句柄是否還存在,之后才使用控件。
在調用下一個委托的時候。先判斷下 在控件上面或者窗體上 IsHandleCreated
