簡體   English   中英

確保所有線程在c#集成測試后停止

[英]ensuring all threads have stopped after c# integration tests

在我的一些集成測試中,我啟動多個線程,並希望確保在集成測試完成時(即使它失敗),線程將被清除。 誰能推薦一種優雅的方式來做到這一點?

謝謝

編輯:感謝大家的答案 - 只是為了澄清,'清理'是指測試線程何時停止並且測試中的其他一些線程沒有QTAgent(測試過程)發出錯誤。

  1. 確保為您創建的每個線程保留Thread對象
  2. 在設置適當的終止信號后,在測試結束時對所有這些調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM