上兩篇文章,主要介紹了Thread、ThreadPool和TPL
多線程異步編程示例和實踐-Thread和ThreadPool
本文中,分享兩則我們在做多線程和異步編程中實際踩過的坑,實際生產(chǎn)環(huán)境遇到的問題,以及解決辦法。
1. HttpClient
業(yè)務(wù)場景:使用HttpClient實現(xiàn)第三方業(yè)務(wù)推送,當(dāng)?shù)谌降腍ttp服務(wù)器不通、或者返回很慢時
線程數(shù)暴漲
Asp.Net\Asp.Net MVC場景下,并發(fā)多線程導(dǎo)致的線程阻塞:HttpClient.PostAysnc/GetAsync.Result
第一種線程數(shù)暴漲的問題,很容易理解,線程執(zhí)行的慢,線程創(chuàng)建的速度快,一直在執(zhí)行,導(dǎo)致線程不斷創(chuàng)建線程、線程數(shù)不斷暴漲。
根本原因是HttpClient的超時時間配置的太長,這點存于業(yè)務(wù)設(shè)計的問題,理論上簡單請求3s沒響應(yīng)就該超時了,復(fù)雜長時間請求使用異步任務(wù)(我們的消息應(yīng)用中心)處理。
第二種,Asp.Net或者Asp.Net MVC場景下,使用HttpClient,同時GetAsync.Result,異步變同步,這就會出現(xiàn)請求Hang住,線程死鎖、請求沒響應(yīng)。
根本原因是Http異步請求的上下文的互相等待導(dǎo)致的。詳細(xì)分析可以參考下面的link: