2010-11-16 36 views
0

我想殺死一個線程,當發生非常糟糕的事情時。你有什麼建議做線程自殺?線程自殺問題

+0

殺死一個線程**是一件非常糟糕的事情。 – 2010-11-16 07:37:37

+7

請參閱[如何在C#中立即殺死線程? ](http://stackoverflow.com/questions/1327102/how-to-kill-a-thread-instantly-in-c)。另外,我認爲你的意思是殺人...... :) – 2010-11-16 07:38:14

+2

如果你強制線程 – Toad 2010-11-16 07:39:55

回答

2

你不應該真的「殺死」一個線程。從您的主程序中,您可以使用Thread.Abort方法中止它,但這不被推薦,並且完全沒有必要。

你的線程應該只是一個執行長循環的方法。如果發生「非常糟糕」的事情,只需從該方法返回並且線程將結束。

這將這樣的循環已經足夠了:

private void MyThreadLoop() 
{ 
    try 
    { 
     while (someCondition) 
     { 
      // do a lengthy operation 
     } 
    } 
    catch (Exception ex) 
    { 
     Log.Error("Something bad happened: ", ex); 
    } 
} 

public void Start() 
{ 
    Thread t = new Thread(MyThreadLoop); 
    t.Start() 
} 

在另一方面,如果你需要你的主要計劃殺死線程(但這不是一個「自殺」,你把它命名爲),那麼你應該信號線程,你想它結束,而不是中止它不知道後臺發生了什麼。

0

有沒有必要完全殺死一個線程,所有你需要做的就是讓它停止對當前任務的工作。

0

線程內部,它足以從其函數返回。在線程之外,有方法Thread.Abort()。

0

你可以嘗試這樣的事情。線程運行,直到它從「外部」接收到一個信號,然後存在。

private static void Main(string[] args) 
{ 
    var shouldExit = new AutoResetEvent(false); 

    ThreadPool.QueueUserWorkItem(
    delegate 
    { 
     while (true) 
     { 
      Console.WriteLine("Running..."); 

      if (shouldExit.WaitOne(0)) break; 
     } 

     Console.WriteLine("Done."); 
    }); 

    // wait a bit 
    Thread.Sleep(1000);  
    shouldExit.Set(); 

    Console.ReadLine(); 
}