有关一个异步函数中的多个任务的问题

问题描述 投票:0回答:1

这是我的代码,用于测试一个异步函数中多个任务的情况:

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");

        }


    }


}

我最初期望发生的事情是:

  1. Main func 打印它的线程
  2. 主功能首次进入
    PrintAndWait
    task1

    PrintAndWait返回但未完成,当遇到第一个await语句时

    await Task.Delay(5000)

  3. Main func 打印“任务 1 创建”
  4. 主功能第二次进入
    PrintAndWait
    task2

    PrintAndWait返回但未完成,当遇到第一个await语句时

    await Task.Delay(5000)

  5. await task1
    所以任务1应该返回等待者,执行50次循环以每秒打印线程ID。 我的问题来了as
    await task1
    是Main中的第一个await语句,我想Main应该返回这里,这意味着在task1完成之前不应运行此行之后的任何代码。所以我期待看到任务 1 首先打印线程信息,然后任务 2 进行打印。
  6. 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机制有什么误解吗?

c# asynchronous async-await
1个回答
0
投票

在控制台应用程序中,任务继续在线程池线程上进行,因为没有同步上下文,因此异步操作完成后任务 2 的继续不需要等待主线程继续执行,而是从主线程中选取一个线程线程池并继续。

© www.soinside.com 2019 - 2024. All rights reserved.