Task.ContinueWith的某些重载不使用SynchronizationContext。它们使用什么SynchronizationContext来调度新任务?
Task.ContinueWith的某些重载不使用SynchronizationContext。它们使用什么SynchronizationContext来调度新任务?
ContinueWith
使用TaskScheduler.Current
作为后续任务,可以在Reference Source中看到。这可能会导致混淆,因为当前(环境)任务调度程序可能与TaskScheduler.Default
不同,并且它也可能与附加到的任务的调度程序不同。这就是为什么.NET 4.5引入了TaskCreationOptions.HideScheduler
和TaskContinuationOptions.HideScheduler
之类的选项。
建议始终在调用Task.Factory.StartNew
和Task.ContinueWith
时明确指定任务调度程序。最常见的是,您可以指定TaskScheduler.Default
(线程池任务调度程序)或TaskScheduler.FromCurrentSynchronizationContext()
。部分Task.ContinueWith的重载方法不支持同步上下文。
实际上,它们都不支持SynchronizationContext
,但有些支持TaskScheduler
。
它们用什么同步上下文来安排新任务?
没有!默认情况下,继续任务是由当前调度程序(TaskScheduler.Current
)安排的,当未从Task
中调用时,默认为TaskScheduler.Default
。因此,继续在线程池中运行。ThreadPool
线程没有相关联的同步上下文(除非您显式设置了一个)。
TaskScheduler.Current
,而不是TaskScheduler.Default
。 - noseratio - open to work