文章出處
文章列表
問題依舊存在
之前寫過相關文章異步編程的文章,本文主要還是一點補充,之前在IIS經常發w3wp進程無做掛了的情況,但一直沒能找到真正的原因,而查找相關資料,找了一些相關的文章,如await和async引起的線程死鎖,也都進行了分析,但和我們項目的情況有些不同,因為在我們項目里只用了ThreadPool和Task.Run這種線程池,而異步用了也是異步到底的!
今天無意中看到一個文章,說到了在ThreadPool中如果出現異常,并且你沒有捕捉它,直接throw了,這時也會引用w3wp進程的死掉,我在電腦上試了一下,確實有這種情況,于是很興奮!
在事件查看器里的截圖
最后將我的線程池方法進行了改良,解決了這個問題
優化后的代碼
/// <summary> /// 線程管理 /// </summary> public class ThreadManager { /// <summary> /// 將在線程池上運行的指定工作排隊 /// </summary> /// <param name="action"></param> public static void Run(Action action) { ThreadPool.QueueUserWorkItem(u => { try { action(); } catch (Exception ex) { Lind.DDD.Logger.LoggerFactory.Instance.Logger_Error(ex); } }); } }
下面我自己做了一個測試,在.net里的4種開啟新線程的方式,及它們是否會引起w3wp服務掛掉,做了一個對比,請看代碼
ThreadPool.QueueUserWorkItem((o) =>//w3wp會有掛機問題 { var b = 0; var c = 1 / b; }); Task.Run(() => //不會有掛機問題 { var b = 0; var c = 1 / b; }); new Thread(() =>//w3wp會有掛機問題 { var b = 0; var c = 1 / b; }).Start(); Task.Factory.StartNew(() =>//不會有掛機問題 { var b = 0; var c = 1 / b; });
最后,很高興找到又一個引起w3wp進程掛掉的原因,希望這次可以真正解決這個問題!
文章列表
全站熱搜