关于这段代码:
static async Task<string> testc()
{
Console.WriteLine("helo async " + Thread.CurrentThread.ManagedThreadId);
await Task.Run(() => {
Thread.Sleep(1000);
Console.WriteLine("task " + Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine("callback "+Thread.CurrentThread.ManagedThreadId);
return "bob";
}
static void Main(string[] args)
{
Console.WriteLine("helo sync " + Thread.CurrentThread.ManagedThreadId);
testc();
Console.WriteLine("over" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.ReadLine();
}
我得到以下输出:
helo sync 10
helo async 10
over10
task 11
callback **11**
没关系:等待之后的一段代码在与任务本身相同的线程中执行。
现在,如果我在 WPF 应用程序中执行此操作:
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Console.WriteLine("helo sync " + Thread.CurrentThread.ManagedThreadId);
testc();
Console.WriteLine("over" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.ReadLine();
}
它生成以下输出:
helo sync 8
helo async 8
over8
task 9
callback **8**
我们可以看到在 UI 线程中执行 await 后的代码。好吧,这很棒,因为它可以操纵可观察的集合等……但我想知道“为什么?” “我怎么能做同样的事?” 这与某些 TaskScheduler 行为有关吗?这是在 .NET Framework 中硬编码的吗?
感谢您提交的任何想法。