C#关于同步方法里面调用异步方法的探究
2026/8/21 8:54:35 网站建设 项目流程

前言

我在写代码的时候(.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(),其中

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询