c# - 我在异步等待方面对上下文的以下理解是否正确?
问题描述
我正在浏览https://blog.stephencleary.com/2012/02/async-and-await.html并且根据作者的说法Context
是以下之一:
如果你在一个 UI 线程上,那么它就是一个 UI 上下文。
如果您正在响应一个 ASP.NET 请求,那么它就是一个 ASP.NET 请求上下文。
否则,它通常是一个线程池上下文。
因此,在具有以下代码的控制台应用程序中:
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 应用程序,它会导致死锁,但在控制台应用程序的情况下不会死锁。控制台应用程序是否是无上下文的,并且可以在需要时使用线程池中的新线程?
解决方案
在您的方法中使用 async 并不一定会导致创建新线程:
特别是在您的情况下,您实际上是在同步运行此方法(没有等待),那么这很可能会在单个线程上运行。要真正“测试”异步功能,您应该开始等待结果,然后看看会发生什么。
推荐阅读
- php - moyasar沙特支付网关(500内部服务器错误)
- c++ - C++中的for循环在带有指针变量的单次迭代后停止
- php - 如何使用 Laravel lighthouse-php 和 vuejs 实现搜索功能?
- javascript - 甜蜜警报确认后未提交表单
- javascript - 如何将 URL 数组转换为树/文件夹结构数据?
- c++ - 如何在 OpenGL 中实现两个不同的窗口(非当代)
- javascript - 我如何在 DOM 中通过 li 标签计数器样式线
- python - WSL2:Python 使用 VS Code 调试器重命名文件
- php - MySQL 服务器已消失 - 数据包乱序。预期 0 收到 1. 数据包大小=72
- php - 如何在 laravel 8 中使用(路由)传递 slug 的参数?