也许我误解了一些东西,但是我总是认为默认情况下,当等待一个不完整的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
是default TaskScheduler
,它代表线程池。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句