我阅读了关于async和await的 微软文档。文档中提到:
async 和 await 关键字不会导致创建额外的线程。
但是我运行了下面的代码:
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
namespace Examples.AdvancedProgramming.AsynchronousOperations
{
public class AsyncMain
{
static void Main()
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Task task = Test();
task.Wait();
}
public async static Task Test()
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1000);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
}
}
}
结果是
1
1
4
很明显,
await Task.Delay(1000);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
这段代码在另一个线程中运行。为什么文档说没有创建线程呢?
我已经阅读了之前的问题“使用async/await会创建新线程吗?”,但它并没有回答我的问题,那个答案只是从Microsoft源代码中复制粘贴过来的。为什么我在测试中看到不同的线程ID?
await
不会产生工作线程,这并不意味着没有工作线程被创建!在异步工作流中有很多东西可以创建工作线程,但await
不是其中之一。你应该问的问题是:在控制台应用程序中,等待任务的继续是否可以安排到工作线程上? 答案是“可以”。 - Eric Lippertasync
,不要在控制台应用程序中这样做。通常,控制台应用程序是更容易学习的环境,但对于async
来说并非如此,因为在控制台应用程序中没有消息循环来管理异步操作。请使用具有顶级消息循环以处理异步方法的项目类型,例如winforms或wpf应用程序。 - Eric Lippert