2013-08-05 79 views
2

基本上 - 我們編寫單元測試。有時這些單元測試會啓動線程 - 並且通常會在線程池中啓動任務。如果後臺線程出現問題 - 可能會導致測試出現未來的奇怪問題。我們要在每個測試的基礎拆機做的基本上是c#線程池和其他線程的檢查

  • 檢查什麼的線程運行
  • 如果正在運行測試失敗不應該是

現在,對於正常線程,我們可以先手動列舉,然後再比較 - 這很好。線程池弄糟了 - 因爲可能有許多有效創建的新線程,它們只是在等待什麼都不做 - 這很好。如果測試讓一些東西繼續運行就不好。還請記住 - 我不寫測試或代碼被測試 - 我正在編寫底層庫,以確保沒有其他人可以搞砸了,但他們努力嘗試 - 所以我不能嘗試使用我自己的實現一個線程池或類似的東西,因爲我不能確定有人不使用標準的。

任何人都可以想出一種方法來告訴線程池擁有哪些線程,以及它們是否空閒?我的下一步是用反射尋找私有變量 - 但我希望有人有更好的方法?

感謝, 達倫

+0

ThreadPool.GetAvailableThreads(),與GetMaxThreads()比較。當代碼離開tp線程時,你可能應該通過測試,這在生產中不太可能達到一個好結果。 –

回答

0

我推斷你使用的發射後不管風格的線程/任務/工作項。如果你不是這樣,你就不會遇到測試後繼續運行的問題。

我認爲即時防火是一個有問題的模式,因爲即使在單元測試之外(在生產中),你也不想忘記錯誤。此外,在ASP.NET中,您不能保證後臺工作將完成,因爲在完成所有待處理的HTTP請求並且後臺工作完成之前,工作進程可以關閉。

因此,我建議您審覈您的代碼並將所有併發性切換到新的基於Task的模型。這可以讓你跟蹤完成。它還允許您等待完成並傳播錯誤。

您可以將所有已啓動的任務添加到列表中(可能使用自定義TaskScheduler,可能是手動)。當單元測試關閉時,您對該列表的內容執行Task.WaitAll。這保證你完成。

在任何情況下,線程池都不允許您偵聽已排隊的項目或完成項目。你需要在你自己的代碼中解決這個問題。