2014-12-19 100 views
4

我的程序中有2個線程。 1正在處理一個GUI,另一個正在做一些字自動操作。讓我們稱他們爲GUIThread和WorkerThread。檢查線程在「殺死」之前是否完成了它的方法c#

WorkerThread正在循環使用遞歸方法。 WorkerThread只在執行單詞自動化時處於活動狀態,用戶必須能夠停止單詞自動化。因此我在GUI上實現了一個「停止」按鈕,它可以簡單地殺死/終止WorkerThread。然而,如果我在一個方法中間殺掉了WorkerThread,它有時會在我的Word文檔中產生一個問題(這是一個更長的故事),這就是爲什麼我要在殺死之前檢查WorkerThread是否已經完成/返回的原因它。

這是我的代碼做什麼,當我點擊「停止」按鈕:

//Stops the worker thread = stops word automation in process 
workerThread.Abort(); 

//This blocks the thread until the workerThread has aborted 
while (workerThread.IsAlive) ; 

我自己的建議/解決辦法對這個問題是有一個全局變量,我可以在的WorkerThread輸入的每個時間設置和左一種方法,但這似乎不適合我。我的意思是我認爲必須有一個更簡單的方法來處理它。

+2

http://msdn.microsoft.com/en-us/library/dd997364(v=vs.110).aspx ---管理線程中的取消 – zerkms 2014-12-19 08:11:23

+1

正如Zerkms所建議的那樣,您必須使用取消令牌 – Younes 2014-12-19 08:13:03

回答

10

但是如果我殺的WorkerThread,而這是在方法進行到一半時,有時會導致一個問題,我的Word文檔

在這就是爲什麼你不應該殺死一個線程。你不能說線程在做什麼,是否可以殺死?等等

Abort沒有做你期望的事情。看看documentation,很微妙調用此方法通常終止線程。注意這個詞通常並不總是。

是的,Abort不會永遠殺死線程。例如,如果線程正在運行非託管代碼,CLR將不會中止線程,而是等待線程返回到託管代碼。當線程處於Constrained Execution Region,finally塊等

的CLR線程延遲爲中止是在CER執行代碼

同一開頭Abort不會做其工作。

例如:嘗試運行以下代碼,看看會發生什麼。

private void IWillNeverReturn() 
{ 
    Thread thread = new Thread(() => 
    { 
     try 
     { 
     } 
     finally 
     { 
      while (true) 
      { } 
     } 
    }); 
    thread.Start(); 

    Thread.Sleep(1000); 
    thread.Abort(); 
} 

讓線程決定它何時應該完成,告訴線程它應該儘快停止。你用CancellationToken來告訴它。

如果你的谷歌爲Thread.Abort Evil,你會發現很多有用的資源,Here is one

相關問題