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