[英]c# check of threadpool and other threads
基本上-我們編寫單元測試。 有時,那些單元測試會啟動線程-並經常在線程池上啟動任務。 如果后台線程出了點問題,可能會在以后的測試中引起奇怪的問題。 我們希望在每個測試的基礎拆解基礎上要做的基本上是
現在,對於普通線程,我們可以事先枚舉,然后與之后進行比較-很好。 線程池將事情搞砸了-因為可能已經有效地創建了許多新線程,而這些線程只是無所事事地等待着-很好。 如果測試使某些程序無法運行,那就不好了。 還要記住-我不是在編寫測試或正在測試的代碼-我正在編寫底層庫,試圖確保沒有其他人可以搞砸事情,不管他們努力嘗試了什么-所以我不能嘗試使用自己的實現線程池之類的東西,因為我不能確定有人沒有使用標准線程池。
誰能想到一種方法來告訴線程池擁有哪些線程,以及它們是否空閑? 我的下一步是使用反射外觀來爬網私有變量-但我希望有人有更好的方法嗎?
謝謝,達倫
我推斷您正在使用即棄型樣式線程/任務/工作項。 如果不是,您將不會遇到問題,因為它們在測試后仍會繼續運行。
我認為“一勞永逸”是一個有問題的模式,因為即使在單元測試之外(在生產中),您也永遠不會忘記錯誤。 另外,在ASP.NET中,不能保證后台工作將永遠完成,因為在處理完所有待處理的HTTP請求之后以及完成后台工作之前,工作進程可能會關閉。
因此,我建議您審核代碼並將所有並發切換到新的基於Task
的模型。 這樣就可以跟蹤完成情況。 它還允許您等待完成並傳播錯誤。
您可以將所有已啟動的任務添加到列表中(可能使用自定義TaskScheduler
,也可能手動使用)。 當單元測試關閉時,您對該列表的內容執行Task.WaitAll
。 那保證您完成。
無論如何,線程池都不允許您監聽排隊的項目或完成。 您需要用自己的代碼解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.