异步 - 等待 - 线程预期

时间:2016-11-13 19:20:25

标签: c# asynchronous async-await task-parallel-library

我有以下代码:

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

输出结果如何:

  1. 有时真有时是假的。

  2. 错误

  3. 有时真有时是假的。

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

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

    感谢!

1 个答案:

答案 0 :(得分:6)

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

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