在我的一些集成測試,我開始多線程,並希望確保當集成測試完成(即使失敗)的線程將被清理。任何人都可以推薦一個優雅的方式來做到這一點?確保所有線程後的C#集成測試已經停止
感謝
編輯:感謝大家的答案 - 只是爲了澄清,「清理」指的是當測試線程停止,一些在測試其他線程沒有QTAgent(測試過程)發生了一個錯誤。
在我的一些集成測試,我開始多線程,並希望確保當集成測試完成(即使失敗)的線程將被清理。任何人都可以推薦一個優雅的方式來做到這一點?確保所有線程後的C#集成測試已經停止
感謝
編輯:感謝大家的答案 - 只是爲了澄清,「清理」指的是當測試線程停止,一些在測試其他線程沒有QTAgent(測試過程)發生了一個錯誤。
Thread
對象創建在測試結束時對所有的人都Thread.Join()
,設置適當的終止信號之後。如果任何線程沒有足夠快地終止,這應該會導致測試失敗,即使測試否則會通過。這是不可能詳細回答這個沒有更多地瞭解你的應用程序和測試架構。
您可以在C#4用的任務,並使用取消標記和/或處理線程結束。請參閱http://msdn.microsoft.com/en-us/library/dd460717.aspx
如果您使用的是.Net 4.0,並且您知道要啓動多少個線程,則可以使用CountdownEvent。然後在每個線程中,有一個try/finally塊來設置事件。在清理代碼中,等待事件。如果您願意,可以添加超時並使用該超時來指示某種錯誤情況。
使用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();
}
}
你能解釋一下你的意思是「清理」。如果線程完成工作或拋出異常,它們將在沒有任何明確干預的情況下被蒸發(除非它們是不按設計的線程池線程 - 它們只是返回到池中)。 –