文章出處

問題依舊存在

之前寫過相關文章異步編程的文章,本文主要還是一點補充,之前在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進程掛掉的原因,希望這次可以真正解決這個問題!

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()