Task.Continue使用什么SynchronizationContext?

Asi*_*sik 4 .net task-parallel-library

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

nos*_*tio 12

默认情况下,ContinueWith使用TaskScheduler.Current针对后续任务,如可以在可见参考源.

这可能是混淆的来源,因为当前(环境)任务调度器可以不同于TaskScheduler.Default,并且它也可以与延续所附加的任务的调度器不同.这就是为什么类似的选项TaskCreationOptions.HideScheduler,并TaskContinuationOptions.HideScheduler进行了intriduced在.NET 4.5.

这是推荐显式调用时始终指定任务调度Task.Factory.StartNewTask.ContinueWith.最常见的是,您指定TaskScheduler.Default(对于线程池任务调度程序)或TaskScheduler.FromCurrentSynchronizationContext().


Tho*_*que 7

Task.ContinueWith的一些重载不采用SynchronizationContext.

实际上,他们都没有拿SynchronizationContext,但有些人拿a TaskScheduler.

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

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

  • *“默认情况下,延续由默认调度程序 (TaskScheduler.Default) 调度,因此它在线程池中的线程上运行”* - 事实上,它默认使用 `TaskScheduler.Current`,而不是 `TaskScheduler。默认`。 (2认同)