簡體   English   中英

C#檢查線程池和其他線程

[英]c# check of threadpool and other threads

基本上-我們編寫單元測試。 有時,那些單元測試會啟動線程-並經常在線程池上啟動任務。 如果后台線程出了點問題,可能會在以后的測試中引起奇怪的問題。 我們希望在每個測試的基礎拆解基礎上要做的基本上是

  • 檢查正在運行的線程
  • 如果正在運行的測試不應該通過測試

現在,對於普通線程,我們可以事先枚舉,然后與之后進行比較-很好。 線程池將事情搞砸了-因為可能已經有效地創建了許多新線程,而這些線程只是無所事事地等待着-很好。 如果測試使某些程序無法運行,那就不好了。 還要記住-我不是在編寫測​​試或正在測試的代碼-我正在編寫底層庫,試圖確保沒有其他人可以搞砸事情,不管他們努力嘗試了什么-所以我不能嘗試使用自己的實現線程池之類的東西,因為我不能確定有人沒有使用標准線程池。

誰能想到一種方法來告訴線程池擁有哪些線程,以及它們是否空閑? 我的下一步是使用反射外觀來爬網私有變量-但我希望有人有更好的方法嗎?

謝謝,達倫

我推斷您正在使用即棄型樣式線程/任務/工作項。 如果不是,您將不會遇到問題,因為它們在測試后仍會繼續運行。

我認為“一勞永逸”是一個有問題的模式,因為即使在單元測試之外(在生產中),您也永遠不會忘記錯誤。 另外,在ASP.NET中,不能保證后台工作將永遠完成,因為在處理完所有待處理的HTTP請求之后以及完成后台工作之前,工作進程可能會關閉。

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

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

無論如何,線程池都不允許您監聽排隊的項目或完成。 您需要用自己的代碼解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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