簡體   English   中英

線程,進程和Application.Exit()

[英]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.CloseMainWindowProcess.KillProcess.Kill它們。

創建一個調用該進程的類,並在它的dispose上終止它。

使用Invoke()並在里面運行Application.Exit()命令,如下所示:

this.Invoke((Action)delegate ()
{
    Application.Exit();
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM