问题描述:每天下午4点开始,服务器CPU跑满,但是该服务和服务器并不宕机
原因定位:观察进程状态发现并发线程数非常多,怀疑同步代码没有合理的控制并发任务数量,review代码发现使用了Parallel且委托方法内有异步方法
ParallelOptions options = new ParallelOptions
{
MaxDegreddOfParallelism = n
};
Parallel.ForEach(list, options, async p=>{
await DoSomethingAsync();
});
需注意,以上代码并不能控制同时只有n个并发进入DoSomethingAsync方法,await的方法不会阻塞主流程代码执行,因此此方法会无限并发直至资源耗尽.
解决方案:降低并发数,异步改为同步