![](/img/trans.png)
[英]Code after 'await Task.Delay(5000)' is not executing until the execution of relaycommand is completed
[英]Execution context for code after await inside Task
也许我误解了一些东西,但是我总是认为默认情况下,当等待不完整的Task时,将捕获当前的“上下文”,并在Task完成时将其用于恢复该方法。 但是我发现了很奇怪的行为(至少对我而言),这是错误的:
private static Task StartTask()
{
return Task.Run(() =>
{
Debug.WriteLine("StartTask thread id = " + Thread.CurrentThread.ManagedThreadId);
});
}
private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
await Task.Run(async () =>
{
Debug.WriteLine("Thread id before await task = " + Thread.CurrentThread.ManagedThreadId);
await StartTask().ConfigureAwait(true);
Debug.WriteLine("Thread id after await task = " + Thread.CurrentThread.ManagedThreadId);
});
}
我在调试输出中收到这样的结果
Thread id before await task = 12
StartTask thread id = 13
Thread id after await task = 13
为什么等待后代码执行上下文发生变化?
默认情况下,当等待不完整的任务时,将捕获当前的“上下文”,并在任务完成时将其用于恢复该方法
没错 您观察到的行为是正确的。
问题是:捕获的“上下文”是什么? 它是当前的SynchronizationContext
,除非为null
,在这种情况下,它是当前的TaskScheduler
。
当Task.Run
执行您的委托时,它正在线程池上执行它。 因此,当前没有SynchronizationContext
。 因此,使用了当前的TaskScheduler
。 请注意,由于实际上并没有执行任务(委托直接在线程池上执行),因此当前TaskScheduler
是默认TaskScheduler
,它代表线程池。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.