【发布时间】:2019-09-14 16:10:57
【问题描述】:
我在 C# 中搞乱 async/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”线程。但我实际上正在努力寻找一些明确的信息。
【问题讨论】:
-
是的,你是对的通常不能保证在同一个线程上返回(这也是你不能在锁定范围内等待的原因之一)。 UI 的默认同步上下文不同。
-
@Johnny 显然 OP 是在 "In a console application, there is no synchronization context" 上的官方文档之后
-
感谢大家提供的建议和信息。
标签: c# .net async-await threadpool