##前言
我在写代码的时候(.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;
namespace ConsoleTool2
{
class Program
{
static void Main(string[] args)
{
Producer();
}
static void Producer()
{
var result = Process().Result;
//或者
//Process().Wait();
}
static async Task Process()
{
await Task.Run(() =>
{
Thread.Sleep(1000);
});
Console.WriteLine("Ended - " + DateTime.Now.ToLongTimeString());
return true;
}
}
}
咱们看这个Producer,这是一个void方法,里面调用了异步方法Process(),其中Process()是一个执行1秒的异步方法,调用的方式是Process().Result 或者Process().Wait()。咱们来运行一遍。
没有任何问题。看起来,这样写完全没有问题啊,不