这是我的代码,用于测试一个异步函数中多个任务的情况:
class EvaluateAwait
{
static async Task Main()
{
Console.WriteLine("Main func: Thread ID = " + Thread.CurrentThread.ManagedThreadId);
Task task1 = PrintAndWait("1");
Console.WriteLine("Task 1 created");
Task task2 = PrintAndWait("2");
Console.WriteLine("Task 2 Created");
await task1;
await task2;
Console.WriteLine("Main Returned.");
}
static async Task PrintAndWait(string id)
{
for (int i = 0; i < 50; i++) {
await Task.Delay(1000);
Console.WriteLine("Thread ID:"+ Thread.CurrentThread.ManagedThreadId + " | Task ID:" +id + " | " );
}
Console.WriteLine("Thread ID: " + Thread.CurrentThread.ManagedThreadId + " | Task ID: " + id + "completed");
}
}
}
我最初期望发生的事情是:
PrintAndWait
为task1
。
PrintAndWait返回但未完成,当遇到第一个await语句时
。await Task.Delay(5000)
PrintAndWait
为task2
。
PrintAndWait返回但未完成,当遇到第一个await语句时
await Task.Delay(5000)
await task1
所以任务1应该返回等待者,执行50次循环以每秒打印线程ID。
我的问题来了,
as await task1
是Main中的第一个await语句,我想Main应该返回这里,这意味着在task1完成之前不应运行此行之后的任何代码。所以我期待看到任务 1 首先打印线程信息,然后任务 2 进行打印。await task2
所以task2应该返回等待者,执行50次循环以每秒打印线程ID。但是输出是
Main func: Thread ID = 1
Task 1 created
Task 2 Created
Thread ID:7 | Task ID:2 |
Thread ID:10 | Task ID:1 |
Thread ID:7 | Task ID:2 |
Thread ID:10 | Task ID:1 |
看起来任务1和任务2同时运行。我对await机制有什么误解吗?
在控制台应用程序中,任务继续在线程池线程上进行,因为没有同步上下文,因此异步操作完成后任务 2 的继续不需要等待主线程继续执行,而是从主线程中选取一个线程线程池并继续。