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
.
如果我们有一个任务,并且我们为该任务创建一个延续(通过 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
.