2011-07-27 55 views
2

在我的一些集成測試,我開始多線程,並希望確保當集成測試完成(即使失敗)的線程將被清理。任何人都可以推薦一個優雅的方式來做到這一點?確保所有線程後的C#集成測試已經停止

感謝

編輯:感謝大家的答案 - 只是爲了澄清,「清理」指的是當測試線程停止,一些在測試其他線程沒有QTAgent(測試過程)發生了一個錯誤。

+0

你能解釋一下你的意思是「清理」。如果線程完成工作或拋出異常,它們將在沒有任何明確干預的情況下被蒸發(除非它們是不按設計的線程池線程 - 它們只是返回到池中)。 –

回答

5
  1. 請務必保持爲每個線程的Thread對象創建在測試結束時對所有的人都
  2. 呼叫Thread.Join(),設置適當的終止信號之後。如果任何線程沒有足夠快地終止,這應該會導致測試失敗,即使測試否則會通過。

這是不可能詳細回答這個沒有更多地瞭解你的應用程序和測試架構。

3

如果您使用的是.Net 4.0,並且您知道要啓動多少個線程,則可以使用CountdownEvent。然後在每個線程中,有一個try/finally塊來設置事件。在清理代碼中,等待事件。如果您願意,可以添加超時並使用該超時來指示某種錯誤情況。

1

使用Thread.Join()將阻止您當前線程,直到您呼叫的加入對退出的線程。在加入之前,您可以根據具體情況指示其他線程以各種方式退出。

調用Thread.Abort()將提高在目標線程的終止異常通常都會把它停了下來,除非你明確地做一些事情,以防止這一點。儘管放棄並不完美。

設置Thread.IsBackground爲true測試線程將確保他們不會讓你活着的過程當你的主線程退出。當進程退出時,後臺線程會自動處理。

就個人而言,我的大多數測試線程往往是在以下模式:

private static readonly ManualResetEvent m_ThreadsShouldExit = new ManualResetEvent(false); 
private static void SomeThreadBody() 
{ 
    while(!m_ThreadsShouldExit.WaitOne(0)) 
    { 
     DoSomething(); 
    } 
} 
相關問題