[英]Threads, processes and Application.Exit()
我的應用程序包括主消息循環(GUI)和線程(Task.Factory)。
在線程中,我使用var p = new Process();
調用一些第三方應用程序var p = new Process();
但是當我調用Application.Exit();
在消息循環中 - 我可以看到在線程中啟動的進程仍在內存中並正在執行。
所以問題是 - 如何在Application.Exit();
之后立即殺死所有線程和進程Application.Exit();
已被調用?
UPD :
舊:
p.WaitForExit();
新:
while (!p.WaitForExit(1000))
{
if (FlagToExit)
{
p.Kill();
return;
}
}
試試吧
當你創建一個線程使它成為后台線程
Thread.IsBackground = true;
並在Application.Exit();
所有線程都將被關閉
發生這種情況是因為您的所有線程都是Foreground
。 並且Foreground
線程(GUI)無法終止另一個Foreground
線程。 因此,您只需要將新線程標記為Background
,這樣就可以為新線程提供與Foreground
線程(GUI)的依賴關系。 如果要將線程標記為Background
線程,只需將其添加到代碼中:
p.IsBackground = true;
創建獨立於父進程的進程。
最好的解決方案是為子進程創建一個信號,並在發出信號時讓它們退出,然后正常關閉它們。
如果進程超出了您的控制范圍,那么當您的父進程准備退出時,您將不得不使用Process.CloseMainWindow
和Process.Kill
來Process.Kill
它們。
創建一個調用該進程的類,並在它的dispose上終止它。
使用Invoke()並在里面運行Application.Exit()命令,如下所示:
this.Invoke((Action)delegate ()
{
Application.Exit();
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.