gpt4 book ai didi

c# - 在 Task 中等待后代码的执行上下文

转载 作者:行者123 更新时间:2023-11-30 20:53:02 24 4
gpt4 key购买 nike

也许我误解了什么,但我一直认为默认情况下,当等待未完成的任务时,会捕获当前“上下文”并用于在任务完成时恢复方法。但是我发现这是错误的非常奇怪的行为(至少对我而言):

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

为什么代码执行上下文在 await 之后发生变化?

最佳答案

by default, when an incomplete Task is awaited, the current “context” is captured and used to resume the method when the Task completes

没错。您观察到的行为是正确的。

问题是:捕获的“上下文”是什么?它是当前的 SynchronizationContext,除非它是 null,在这种情况下它是当前的 TaskScheduler

Task.Run 执行您的委托(delegate)时,它是在线程池上执行的。因此,没有当前的 SynchronizationContext。所以使用当前的TaskScheduler;请注意,由于实际上并没有执行任务(委托(delegate)直接在线程池上执行),因此当前的 TaskScheduler 是默认的 TaskScheduler,代表线程池。

关于c# - 在 Task 中等待后代码的执行上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20331993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com