TaskContinuations 运行 与异步 lambda 同步

TaskContinuations ran synchronously with async lambdas

如果我们有一个任务,并且我们为该任务创建一个延续(通过 ContinueWith),使用 TaskContinuationOptions.RunSynchronously,如果在 ContinueWith 中执行的方法如下:

static async Task SimpleMethodContinuationAsync(Task antecedentTask, object state)
{
    // some very lightweight, thread-safe synchronous code.
    await Task.Delay(5000); // Simulate async work.
    // continuation of some more very lightweight, thread-safe synchronous code.
}

await 之后的部分 - 它会有效地释放开始执行任务继续的线程吗?这个续集的其余部分将在哪个线程上恢复?

问题是在没有 SynchronizationContext 用于上述延续的先行任务时提出的,但我听说 SynchronizationContext 不会流经 ContinueWith 方法调用?是真的吗?

我支持 Marc 的评论:you should avoid ContinueWith;这是一个低级别 API,具有潜在危险的默认行为。

The part after the await - will it effectively release the thread that started executing the task continuation?

await 会做到这一点,是的。

And on which thread will the rest of this continuation resume? ... The question is asked when there is no SynchronizationContext present for the antecedent task of the continuation above

很可能是线程池线程完成了 Task.Delay 返回的 Task。这是因为 await uses TaskContinuationOptions.ExecuteSynchronously(注意:这是一个实现细节;不依赖于此行为)。

我说“最有可能”是因为 there are situations where ExecuteSynchronously doesn't execute synchronously。这是一个优化提示,而不是要求。这也适用于 await 之前的延续部分:最有可能(不是 肯定)运行在完成先前任务的线程上。

but I've heard that SynchronziationContext does not flow through ContinueWith method calls? Is that true?

ContinueWith 在任务级别工作。它有一些流经 TaskScheduler.Current 的逻辑(IMO 是使这个 API 危险的一个方面),但没有意识到 SynchronizationContext.