首页 > 解决方案 > 我在异步等待方面对上下文的以下理解是否正确?

问题描述

我正在浏览https://blog.stephencleary.com/2012/02/async-and-await.html并且根据作者的说法Context是以下之一:

  1. 如果你在一个 UI 线程上,那么它就是一个 UI 上下文。

  2. 如果您正在响应一个 ASP.NET 请求,那么它就是一个 ASP.NET 请求上下文。

  3. 否则,它通常是一个线程池上下文。

因此,在具有以下代码的控制台应用程序中:

public static void Main()
{
    Thread.CurrentThread.Name = "MainThread";
    var task = SomeAsync();
    string result = task.Result;
    Console.WriteLine(result);
}

private static async Task<string> SomeAsync() {
    await Task.Delay(2000);
    return "random String";
}

这里我们从方法开始一个异步Main方法。此异步方法的执行将花费 2 秒,当它完成时,控件将返回到Main我们阻塞异步方法结果的行的方法中。所以我们可以说MainThread被阻塞 等待 的结果SomeAsync。到时间SomeAsync完成时,MainThread仍然被阻止。

那么我可以说 async 方法的延续将在与线程池不同的线程上执行(因为此代码可以正常工作并正确打印字符串)?如果它是一个 UI 应用程序,它会导致死锁,但在控制台应用程序的情况下不会死锁。控制台应用程序是否是无上下文的,并且可以在需要时使用线程池中的新线程?

标签: c#asynchronousasync-awaitconsole-application

解决方案


在您的方法中使用 async 并不一定会导致创建新线程:

使用 async/await 会创建一个新线程吗?

特别是在您的情况下,您实际上是在同步运行此方法(没有等待),那么这很可能会在单个线程上运行。要真正“测试”异步功能,您应该开始等待结果,然后看看会发生什么。


推荐阅读