我有以下代码:
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的更多信息。