2010-08-22 97 views
11

我有一個單線程,它有一個運行線程用於從服務器獲取記錄。 但是,當我停止我的winform應用程序線程繼續運行。我試圖在單例中創建一個析構函數來中止該線程(如果它正在運行),但它對線程沒有任何影響 - 我知道析構函數正在被喚起。當我的winform應用程序關閉時,我該如何停止線程

我正在尋找關於如何在應用程序關閉時關閉線程的建議。 感謝

C#,.NET2

+0

可能重複[?如何停止的BackgroundWorker在窗體的Closing事件(http://stackoverflow.com/questions/1731384/how-to-stop- backgroundworker-on-forms-closing-event) – 2010-08-22 15:43:17

+0

我看着你的鏈接消化...它沒有爲我做一件事 – fishhead 2010-08-22 15:46:14

回答

9

最好的選擇,如果可能的話在你的應用程序,是合作取消。

線程在沒有更多代碼執行時自動停止。所以,當用戶關閉你的應用程序時,你設置了一個標誌,表明你的線程應該停止。線程需要不時檢查標誌是否設置,如果是,則停止從服務器獲取記錄並返回。

否則,你可以推出自己的解決方案,例如

static bool isCancellationRequested = false; 
static object gate = new object(); 

// request cancellation 
lock (gate) 
{ 
    isCancellationRequested = true; 
} 

// thread 
for (int i = 0; i < 100000; i++) 
{ 
    // simulating work 
    Thread.SpinWait(5000000); 

    lock (gate) 
    { 
     if (isCancellationRequested) 
     { 
      // perform cleanup if necessary 
      //... 
      // terminate the operation 
      break; 
     } 
    } 
} 
54

一個線程可以是:

  • 前景:將永葆你的程序,直到它完成。
  • 背景:關閉應用程序時將終止。

當您創建一個線程時,默認情況下它是一個前臺線程。

你可以改變這樣的:

Thread t = new Thread(myAction); 
t.IsBackground = true; 
t.Start();
+0

當窗體關閉時後臺線程是否結束?例如,假設我有多個表單,並且在一種表單中有一個線程。當表單關閉時,即使線程處於無限循環,線程也會終止嗎?或者當應用程序退出時(當Main完成處理時)該線程結束? – JT9 2015-10-28 14:56:41

+0

@ JT9我剛剛測試過它,後臺線程不會在多表單應用程序中關閉表單時結束。 – tunafish24 2016-07-14 08:24:54

相關問題