Task.ContinueWith的某些重载不会使用SynchronizationContext。他们使用什么SynchronizationContext来安排新任务?
答案 0 :(得分:12)
默认情况下,ContinueWith
使用TaskScheduler.Current
作为延续任务,如Reference Source中所示。
这可能会引起混淆,因为当前(环境)任务调度程序可能与TaskScheduler.Default
不同,并且它也可能与延续所附加的任务的调度程序不同。这就是为什么像TaskCreationOptions.HideScheduler
和TaskContinuationOptions.HideScheduler
这样的选项在.NET 4.5中被引入的原因。
在调用Task.Factory.StartNew
和Task.ContinueWith
时,始终recommended明确指定任务计划程序。最常见的是,您指定TaskScheduler.Default
(对于线程池任务调度程序)或TaskScheduler.FromCurrentSynchronizationContext()
。
答案 1 :(得分:7)
Task.ContinueWith的一些重载不接受SynchronizationContext。
实际上,他们都不会使用SynchronizationContext
,但有些会使用TaskScheduler
。
他们使用什么SynchronizationContext来安排新任务?
无!默认情况下,延迟由当前调度程序(TaskScheduler.Current
)调度,当未从Task
调用时,调度程序为TaskScheduler.Default
。所以继续是在线程池的一个线程上运行的。 ThreadPool
个线程没有关联的同步上下文(除非您明确设置了一个)。