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