为了账号安全,请及时绑定邮箱和手机立即绑定

为什么此异步/等待代码不会死锁

为什么此异步/等待代码不会死锁

C#
料青山看我应如是 2022-08-20 15:19:06
我正在阅读这篇关于死锁的文章,我尝试使用自己的代码,它没有死锁问题。为什么?我期待:GetJsonAsync完成等待并即将返回jsonStringMain正在执行并保留上下文jsonTask.ResultGetJsonAsync想要返回,直到上下文可用jsonString死锁将会发生   public static void Main(string[] args)    {        var jsonTask = GetJsonAsync();        int i = jsonTask.Result;        Console.WriteLine(jsonTask.Result);    }    public static async Task<int> GetJsonAsync()    {        var jsonString = await ReturnIntAsync();        return jsonString;    }    public static async Task<int> ReturnIntAsync()    {        int i = 0;        await Task.Run(() => i++);        return i;    }
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

它不会死锁,因为没有同步,因此该方法在线程池线程(而不是主线程)上恢复执行。SynchronizationContextasync

本文的相关引文(着重号为作者所加):

情况是这样的:请记住,在我的介绍性帖子中,在您等待任务后,当方法继续时,它将在上下文中继续。

在第一种情况下,此上下文是 UI 上下文(适用于控制台应用程序以外的任何 UI)。在第二种情况下,此上下文是 ASP.NET 请求上下文...

对于 UI 示例,“上下文”是 UI 上下文;对于 ASP.NET 示例,“上下文”是 ASP.NET 请求上下文。这种类型的死锁可以对任何一个“上下文”造成。

如果你确实希望以这种方式使控制台应用程序死锁,则可以使用我的 AsyncEx 库中在控制台应用程序的主线程上安装单线程上下文。AsyncContext


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信