异步 - 等待 - 线程预期

maz*_*maz 3 c# asynchronous task-parallel-library async-await

我有以下代码:

  static void Main(string[] args)
    {
        Run1();
        Run2().Wait();
    }

    static async Task DoAsyncWork()
    {
        await Task.Delay(2000);
    }

    static async Task Run2()
    {
        var tid = Thread.CurrentThread.ManagedThreadId;
        await DoAsyncWork();
        Console.WriteLine(tid == Thread.CurrentThread.ManagedThreadId);
    }

    static void Run1()
    {
        var tid = Thread.CurrentThread.ManagedThreadId;
        DoAsyncWork().Wait();
        Console.WriteLine(tid == Thread.CurrentThread.ManagedThreadId);
    }
Run Code Online (Sandbox Code Playgroud)

什么是输出:

  1. 有时真有时是假的.

    真正

  2. 真正

    有时真有时是假的.

  3. 真正

    真正

我认为3是正确答案,但是当我运行代码时,我得到:

真正

我知道为什么第一个打印是真的,但任何人都可以解释为什么当我运行代码时,我得到假?(我如何在第二次印刷中获得真实?)

谢谢!

ibe*_*bbs 6

控制台应用程序没有同步上下文,因此await无法返回到上一个线程.这就是为什么你看到一个不同的线程ID Run2.

你可以在这里阅读更多相关信息.