Task.ContinueWith使用什么同步上下文?

6

Task.ContinueWith的某些重载不使用SynchronizationContext。它们使用什么SynchronizationContext来调度新任务?


2
你是指TaskScheduler吗? - Yevgeniy.Chernobrivets
2个回答

15
默认情况下,ContinueWith使用TaskScheduler.Current作为后续任务,可以在Reference Source中看到。这可能会导致混淆,因为当前(环境)任务调度程序可能与TaskScheduler.Default不同,并且它也可能与附加到的任务的调度程序不同。这就是为什么.NET 4.5引入了TaskCreationOptions.HideSchedulerTaskContinuationOptions.HideScheduler之类的选项。 建议始终在调用Task.Factory.StartNewTask.ContinueWith时明确指定任务调度程序。最常见的是,您可以指定TaskScheduler.Default(线程池任务调度程序)或TaskScheduler.FromCurrentSynchronizationContext()

7

部分Task.ContinueWith的重载方法不支持同步上下文。

实际上,它们都不支持SynchronizationContext,但有些支持TaskScheduler

它们用什么同步上下文来安排新任务?

没有!默认情况下,继续任务是由当前调度程序(TaskScheduler.Current)安排的,当未从Task中调用时,默认为TaskScheduler.Default。因此,继续在线程池中运行。ThreadPool线程没有相关联的同步上下文(除非您显式设置了一个)。


2
默认情况下,继续使用默认调度程序(TaskScheduler.Default)进行安排,因此它将在线程池中的一个线程上运行。实际上,默认情况下使用的是TaskScheduler.Current,而不是TaskScheduler.Default - noseratio - open to work

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接