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

我正在阅读篇关于死锁的文章,我尝试使用自己的代码,它没有死锁问题。为什么?

我期待:

  1. GetJsonAsync完成等待并即将返回jsonString

  2. Main正在执行并保留上下文jsonTask.Result

  3. GetJsonAsync想要返回,直到上下文可用jsonString

  4. 死锁将会发生

   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;

    }


料青山看我应如是
浏览 73回答 1
1回答

慕后森

它不会死锁,因为没有同步,因此该方法在线程池线程(而不是主线程)上恢复执行。SynchronizationContextasync本文的相关引文(着重号为作者所加):情况是这样的:请记住,在我的介绍性帖子中,在您等待任务后,当方法继续时,它将在上下文中继续。在第一种情况下,此上下文是 UI 上下文(适用于控制台应用程序以外的任何 UI)。在第二种情况下,此上下文是 ASP.NET 请求上下文...对于 UI 示例,“上下文”是 UI 上下文;对于 ASP.NET 示例,“上下文”是 ASP.NET 请求上下文。这种类型的死锁可以对任何一个“上下文”造成。如果你确实希望以这种方式使控制台应用程序死锁,则可以使用我的&nbsp;AsyncEx&nbsp;库中在控制台应用程序的主线程上安装单线程上下文。AsyncContext
打开App,查看更多内容
随时随地看视频慕课网APP