【问题标题】:What SynchronizationContext does Task.ContinueWith use?Task.ContinueWith 使用什么 SynchronizationContext?
【发布时间】:2021-11-02 23:45:49
【问题描述】:

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

【问题讨论】:

  • 你的意思是TaskScheduler?

标签: .net task-parallel-library


【解决方案1】:

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

这可能会造成混淆,因为当前(环境)任务调度程序可能与TaskScheduler.Default 不同,也可能与延续所附加到的任务的调度程序不同。这就是在 .NET 4.5 中引入 TaskCreationOptions.HideSchedulerTaskContinuationOptions.HideScheduler 等选项的原因。

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

【讨论】:

    【解决方案2】:

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

    实际上,没有人使用SynchronizationContext,但有些人使用TaskScheduler

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

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

    【讨论】:

    • “默认情况下,continuation 由默认调度程序 (TaskScheduler.Default) 调度,因此它在线程池中的线程上运行” - 实际上,它使用默认为TaskScheduler.Current,而不是TaskScheduler.Default
    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多