上两篇文章,主要介绍了Thread、ThreadPool和TPL

多线程异步编程示例和实践-Thread和ThreadPool

多线程异步编程示例和实践-Task

本文中,分享两则我们在做多线程和异步编程中实际踩过的坑,实际生产环境遇到的问题,以及解决办法。

1. HttpClient

业务场景:使用HttpClient实现第三方业务推送,当第三方的Http服务器不通、或者返回很慢时

  • 线程数暴涨

  • Asp.Net\Asp.Net MVC场景下,并发多线程导致的线程阻塞:HttpClient.PostAysnc/GetAsync.Result

第一种线程数暴涨的问题,很容易理解,线程执行的慢,线程创建的速度快,一直在执行,导致线程不断创建线程、线程数不断暴涨。

根本原因是HttpClient的超时时间配置的太长,这点存于业务设计的问题,理论上简单请求3s没响应就该超时了,复杂长时间请求使用异步任务(我们的消息应用中心)处理。

第二种,Asp.Net或者Asp.Net MVC场景下,使用HttpClient,同时GetAsync.Result,异步变同步,这就会出现请求Hang住,线程死锁、请求没响应。

根本原因Http异步请求的上下文的互相等待导致的。详细分析可以参考下面的link:

网友评论