问题背景
在业务场景中,有一个循环发请求的需求,使用并发后还是非常慢,观测线程数稳定在20个左右。猜测可能是线程池的原因限制了线程的增长。
场景模拟
首先写了一个简单的延迟,代表请求。
public static string Test() {
Task.Delay(2000);
return "t";
}
然后写一个简单的数组添加方法
public static List<string> t = new List<string>();
public void add(string str) {
lock (t) {
t.Add(str);
}
}
最后更改一下线程池设置
int minWorker, minIOC; int workerThreads;
int portThreads;
ThreadPool.GetMinThreads(out minWorker, out minIOC);
ThreadPool.GetMaxThreads(out workerThreads, out portThreads);
ThreadPool.SetMaxThreads(workerThreads, portThreads);
ThreadPool.SetMinThreads(1000,1);
开始测试
测试循环数:5000
测试情况一:异步 不等待
测试情况二:异步 等待
测试循环数:10000
不等待:
等待:
原因分析:
.net 的线程池没办法立即控制线程数,线程的数量是根据线程池内可用线程数量决定的,换言之,线程数量少的时候,线程池会新建线程,使用await时不会发生阻塞,所以会一直有空闲线程,线程池内的线程就不会增加。
测试是在win平台下,.net core 3.+,结果具有随机性。