Winform同步调用异步函数死锁原因分析、为什么要用异步 (5)

原因: 线程池默认的最小工作线程数量为CPU核心数,如果不采用async会导致线程同步阻塞,需要线程池创建更多的工作线程来应对的并发。当线程池工作线程的数量大于最小工作线程数量时,工作线程的创建速度受限于最小工作线程数量,每秒不超过2个,这时候程序会出现假死的情况。线程池默认设置最小工作线程数量为CPU核心数,主要是希望使用async通过多路复用来提升程序的并发性能。如果旧程序不好改造,快速解决的方法就是通过ThreadPool.SetMinThreads设置最小工作线程数量,放开工作线程创建速度限制,以多线程模型应对更多的并发,虽然系统性能差一些,至少不会假死。

小实验:

Demo源码地址: https://gitee.com/RiverBied/async-demo

启动Web.Api站点,运行WinForms.App进行测试,不过不要在调试状态运行。

image-20211017162854078

HttpClient.GetStringAsync执行过程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzsggs.html