前言我在写代码的时候(.net core)有时候会碰到void方法里,调用async方法并且Wait,而且我还看到别人这么写了。而且我这么写的时候,编译器没有提示任何警告。但是看了dudu的文章:一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相 了解了,这样写是有问题的。但是为什么会有问题呢?我又阅读了dudu文章里提到的一篇博文:.NET Threadpool starvation, and how queuing makes it worse 加上自己亲手实验,写下自己的理解,算是对dudu博文的一个补充和丰富吧。同步方法里调用异步方法同步方法里调用异步方法,一种是wait() 一种是不wait()voidfun(){ funAsync.Wait(); funAsync();}这两种场景都没有编译错误。首先我们来看一下,在 void里调用 async 方法,并且要等待async的结果出来之后,才能进行后续的操作。usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleTool2{classProgram{static void Main(string[] args) { Producer(); }static void Producer(){varresult =Process().Result;//或者//Process().Wait(); }static asyncTaskboolProcess(){awaitTask.Run(() = { Thread.Sleep(1000); }); Console.WriteLine("Ended - "+DateTime.Now.ToLongTimeString());returntrue; } }}咱们看这个Producer,这是一个void方法,里面调用了异步方法Process(),其中