我在 C# 中弄乱了 async/await 只是为了深入研究一些线程控制流并偶然发现了一个不寻常的行为,我真的很感谢澄清。即使 Task 本身在后台执行,await 之后的执行也会在调用线程上继续执行,这是有道理的。事实上,这正是发生在 WPF 中的情况。
以下代码:
private async void Button_Click(object sender, RoutedEventArgs e)
{
Console.WriteLine($"Start. Thread: {Thread.CurrentThread.ManagedThreadId}");
await Task.Run(async () => await Task.Delay(1000));
Console.WriteLine($"End. Thread: {Thread.CurrentThread.ManagedThreadId}");
}
结果:
开始。线程:1
结束。线程:1
我意识到这是使程序流可预测等的方法。
但令我惊讶的是 .NET 控制台应用程序的异步 Main 方法功能显示出有些不同的行为。
相同的代码:
static async Task Main(string[] args)
{
Console.WriteLine($"Start. Thread: {Thread.CurrentThread.ManagedThreadId}");
await Task.Run(async () => await Task.Delay(1000));
Console.WriteLine($"End. Thread: {Thread.CurrentThread.ManagedThreadId}");
}
导致不同的线程控制流程:
启动。线程:1
结束。线程:5
我的猜测是,控制台应用程序具有不同的同步上下文概念,并且不像 WPF 那样绑定到主“UI”线程。但我实际上正在努力寻找一些明确的信息。
千巷猫影
相关分类