[英]ensuring all threads have stopped after c# integration tests
在我的一些集成測試中,我啟動多個線程,並希望確保在集成測試完成時(即使它失敗),線程將被清除。 誰能推薦一種優雅的方式來做到這一點?
謝謝
編輯:感謝大家的答案 - 只是為了澄清,'清理'是指測試線程何時停止並且測試中的其他一些線程沒有QTAgent(測試過程)發出錯誤。
Thread
對象 Thread.Join()
。 如果任何線程沒有足夠快地終止,這將導致測試失敗,即使測試本來會通過。 如果不了解您的應用程序和測試架構,就不可能更詳細地回答這個問題。
如果您使用的是.Net 4.0,並且知道要啟動多少個線程,則可以使用CountdownEvent 。 然后在每個線程中,有一個try / finally塊來設置事件。 在清理代碼中,等待事件。 如果您願意,可以添加超時並使用它來指示某些錯誤情況。
您可以在C#4中使用任務並使用取消令牌和/或處理線程的結尾。 請參閱http://msdn.microsoft.com/en-us/library/dd460717.aspx
使用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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.