2010-09-11 48 views
3

我的應用程序由主消息循環(GUI)和線程(Task.Factory)組成。線程,進程和Application.Exit()

在我打電話與var p = new Process();

一些第三方應用程序的線程但是,當我在消息循環調用Application.Exit(); - 我可以看到,這是在線程啓動的進程,仍然在內存和正在執行。

所以問題是 - 如何在Application.Exit();被調用後立即終止所有線程和進程?

UPD

老:

p.WaitForExit(); 

新:

while (!p.WaitForExit(1000)) 
{ 
    if (FlagToExit) 
    { 
     p.Kill(); 
     return; 
    } 
} 

回答

3

處理的Application.ApplicationExit事件。

+0

所以我只需要創建一些布爾標誌,我需要在線程中觀察它什麼時候變成真(我將在Application.ApplicationExit事件中賦值爲true)然後終止進程? – zerkms 2010-09-11 03:21:03

+0

我已添加更新,關於我如何實現它。請批評它。 – zerkms 2010-09-11 03:34:43

+0

你說什麼應該工作。 – 2010-09-11 06:26:03

1

過程獨立於父進程創建。

最好的解決方案是爲子進程創建一個信號,並在信號發出時退出,並正常關閉它們。

如果這些進程不在您的控制範圍內,那麼當您的父進程準備退出時,您必須使用Process.CloseMainWindowProcess.Kill來殺死它們。

+0

爲什麼'Process.Kill'​​不能工作? – 2010-09-11 04:03:07

+0

它會的。我使用傳統名稱Terminate進行搜索,所以我錯過了'Kill'​​方法。答案已更新。 – 2010-09-11 11:38:23

0

創建一個類,調用該進程並在其處置時終止它。

8

只要試試這個

當你創建一個線程使後臺線程

Thread.IsBackground = true; 

Application.Exit();

所有線程將被關閉

+0

-1:這不會終止子進程,這是操作問題的一半。 – 2010-09-11 11:40:19

1

這是因爲所有的線程是Foreground。並且Foreground線程(GUI)不能終止另一個Foreground線程。所以你只需要將你的新線程標記爲Background,這樣你的Foreground線程(GUI)會給新線程一個依賴。 如果你想標記線表示Background線程,你只需要添加到您的代碼:

p.IsBackground = true; 
+6

由此,您不再需要使用Application.ApplicationExit。 – parseh 2015-08-10 06:42:38

-1

使用的invoke(),然後運行Application.Exit()命令裏是這樣的:

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