我有以下代码:

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


输出是什么:


有时为真,有时为假。

真正



真正

有时为真,有时为假。
真正

真正


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

真正



我知道为什么第一个打印结果为True,但是任何人都可以向我解释为什么始终运行代码时会得到False? (我如何在第二张纸上得到True?)

谢谢!

最佳答案

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

您可以阅读有关此here的更多信息。

09-20 23:46