Task.Continue使用什么SynchronizationContext?

时间:2014-04-28 20:31:22

标签: .net task-parallel-library

Task.ContinueWith的某些重载不会使用SynchronizationContext。他们使用什么SynchronizationContext来安排新任务?

2 个答案:

答案 0 :(得分:12)

默认情况下,ContinueWith使用TaskScheduler.Current作为延续任务,如Reference Source中所示。

这可能会引起混淆,因为当前(环境)任务调度程序可能与TaskScheduler.Default不同,并且它也可能与延续所附加的任务的调度程序不同。这就是为什么像TaskCreationOptions.HideSchedulerTaskContinuationOptions.HideScheduler这样的选项在.NET 4.5中被引入的原因。

在调用Task.Factory.StartNewTask.ContinueWith时,始终recommended明确指定任务计划程序。最常见的是,您指定TaskScheduler.Default(对于线程池任务调度程序)或TaskScheduler.FromCurrentSynchronizationContext()

答案 1 :(得分:7)

  

Task.ContinueWith的一些重载不接受SynchronizationContext。

实际上,他们都不会使用SynchronizationContext,但有些会使用TaskScheduler

  

他们使用什么SynchronizationContext来安排新任务?

无!默认情况下,延迟由当前调度程序(TaskScheduler.Current)调度,当未从Task调用时,调度程序为TaskScheduler.Default。所以继续是在线程池的一个线程上运行的。 ThreadPool个线程没有关联的同步上下文(除非您明确设置了一个)。