不同方式退出主线程的区别
(1)正常窗口关闭时相当于调用Form.Close(),先执行OnClosing,再执行FormClosing事件,再执行OnFormClosed,再执行FormClosed事件,再释放资源,再执行Application_ThreadExit事件,最后主线程完全退出Application.Run(),后台子线程在主线程退出后退出
(2)调用Application.Exit()方法,将不执行OnClosing方法,直接从FormClosing事件的顺序开始执行,因此不能在OnClosing中进行取消操作。
(3)若直接调用Application.ExitThread()方法,不会触发窗口关闭的一系列事件,直接释放资源后退出
对于子线程在窗口资源释放后才退出,(调试时)造成如果对主窗口的界面进行操作会报错的问题
主线程启动退出,由于子线程中有访问窗体控件,因此会出现访问窗体句柄错误的问题,给人主线程退出子线程却没有退出的错局,其实主线程还没有退出,主线程要释放完窗体资源后才退出,不然谁来执行释放资源的方法
解决办法:对于访问窗体界面的需求,(1)使用主线程用委托调用(2)用Timer代替无线循环的子线程来刷新界面,因为执行Timer的是主线程主线程(3)在主线程释放窗体前手动关闭子线程(4)给界面刷新的子线程加try_catch,不要让显示报错
例如:
<