【发布时间】:2021-11-02 23:45:49
【问题描述】:
Task.ContinueWith 的某些重载不采用 SynchronizationContext。他们使用什么 SynchronizationContext 来安排新任务?
【问题讨论】:
-
你的意思是TaskScheduler?
标签: .net task-parallel-library
Task.ContinueWith 的某些重载不采用 SynchronizationContext。他们使用什么 SynchronizationContext 来安排新任务?
【问题讨论】:
标签: .net task-parallel-library
默认情况下,ContinueWith 使用TaskScheduler.Current 进行延续任务,如Reference Source 所示。
这可能会造成混淆,因为当前(环境)任务调度程序可能与TaskScheduler.Default 不同,也可能与延续所附加到的任务的调度程序不同。这就是在 .NET 4.5 中引入 TaskCreationOptions.HideScheduler 和 TaskContinuationOptions.HideScheduler 等选项的原因。
recommended 在调用Task.Factory.StartNew 和Task.ContinueWith 时始终明确指定任务调度程序。最常见的是指定TaskScheduler.Default(用于线程池任务调度程序)或TaskScheduler.FromCurrentSynchronizationContext()。
【讨论】:
Task.ContinueWith 的一些重载不采用 SynchronizationContext。
实际上,没有人使用SynchronizationContext,但有些人使用TaskScheduler。
他们使用什么 SynchronizationContext 来安排新任务?
没有!默认情况下,延续由当前调度程序 (TaskScheduler.Current) 调度,当不从Task 调用时,它是TaskScheduler.Default。所以延续是在线程池中的一个线程上运行的。 ThreadPool 线程没有关联的同步上下文(除非您明确设置)。
【讨论】:
TaskScheduler.Current,而不是TaskScheduler.Default。