2013-10-22 79 views
4

我需要在兩臺不同的服務器上執行一項耗時的任務。關閉GUI時殺死線程

服務器的數量可能會有所不同。

我需要在大致相同的時間在每臺機器上執行相同的任務,否則它會使此過程花費的時間增加四倍。

到目前爲止,我已經能夠拿出這樣的:

public partial class Form_main : Form 
{ 
    list<string> vms = new list<string>; 
    ///Fill in vms... 
    private void startTest() 
    { 
     ///prevents GUI from hanging 
     ThreadPool.QueueUserWorkItem(new WaitCallback(runTests)); 
    } 
    pirvate void runTests() 
    { 
     ///Some setup stuff (~1 min) 
     foreach(string vm in vms) 
     { 
      ThreadPool.QueueUserWorkItem(new WaitCallback(testProcedure), new object[] {vm}); 
     } 
    } 
} 

這適用於同時運行的一切,但問題是,如果GUI被殺死線程沒有得到與它一起遇難。我想象它會殺死runTests線程,但不會終止testProcedures線程。

我該怎麼做才能讓testProcedures線程在關閉GUI時被殺死?

+2

當你關閉GUI時,Application.Run(...)運行完成並退出'static void Main(string [] args)'方法?後臺線程不會自動殺死,直到所有的forground線程完成。 「Main」不是正在退出,或者您正在其他地方創建前景線程,而您沒有顯示。 –

+2

與[aborting](http://stackoverflow.com/a/1560567/533120)相反,您應該協作退出線程(即設計一種機制,以便您可以「向線程發出信號」,以便在接下來應該優雅地停止適時的時刻)。並考慮使用[任務](http://msdn.microsoft.com/en-us/library/ff963549.aspx)(及其取消令牌)而不是「裸」線程。 –

回答

1

您可以在主窗體的OnFormClosed處理程序中調用Environment.Exit方法。

+1

這使問題變得模糊。如果你有其他的前臺線程正在運行,那麼你應該確定你是否真的需要前臺線程;也許他們應該是後臺線程。如果'Application.Run'沒有結束,那麼其他的東西就是保持UI的活着,你應該確定那裏發生的事情並解決它。這隱藏了一個潛在的問題,而不是修復它。 – Servy

+1

你是對的還是錯的。是的,可能有問題。但也許不是。例如,在.net 1.0中,所有線程都不會在主線程出口自動終止。調查無法解決的問題通常太昂貴了,而這些問題可以可靠地用單線解決方案來處理。在描述的情況下,我們知道我們想要全部殺死他們,這就是我們正在做的事情?有沒有更好的方法來做到這一點?也許。從長遠來看,它會消耗更少的時間嗎?幾乎不。 –

+1

如果您已經具體調查了將應用程序保持在活動狀態並確認沒有其他方式更優雅地結束應用程序,那麼可以肯定的是,這可能是偶爾有效的最後手段。這個問題清楚地表明情況並非如此,因爲他不知道是什麼導致應用程序繼續存在。如果您不知道底層問題是什麼,那麼這是一個完全不適當的解決方案,因爲您可能會遇到像這樣的應用程序被殺的重大問題。建議OP甚至不嘗試診斷問題簡直是不可接受的。 – Servy