【问题标题】:Which task scheduler is used by default when starting/running/invoking tasks in .NET?在 .NET 中启动/运行/调用任务时默认使用哪个任务调度程序?
【发布时间】:2020-02-19 07:53:55
【问题描述】:

当我从使用特定调度程序运行的任务启动任务时,使用哪个任务调度程序?

Task.Factory.StartNew(A, CancellationToken.None, TaskCreationOptions.None, new MyTaskScheduler());

// ...

void A()
{
    // 1
    Parallel.Invoke(sometasks);

    // 2
    Task.Run(sometask);

    // 3
    Parallel.For(/*...*/);

    // 4
    // Any other task execution that isn't specifying a scheduler explicitly
}

是否所有示例都将由 MyTaskScheduler 安排?我想使用 QueuedTaskScheduler (From ParallelExtensionsExtras) 来处理复杂 Web api 请求(可能启动任务和/或使用其他 TPL 功能)的优先级和并发限制。

【问题讨论】:

  • 无论在子 TPL 方法中哪个 task schedulercurrent thread 相关联,都会使用默认的 task scheduler (如图所示)AFAIK
  • @MichaelRandall 所以链接的博客文章中的这个声明是错误的? “任务和它们包含的并行循环都将被限制为最大并发级别 4。”
  • Stephen 将 task scheduler 传递到 Parallel.For 选项中,你不是
  • @MichaelRandall 谢谢,我是个白痴

标签: c# .net task task-parallel-library


【解决方案1】:

对于大多数 TPL 方法,经验法则是默认使用 task scheduler,无论使用哪个 task scheduler当前线程 相关联,除非您另有明确说明。

您会发现大多数方法要么采用 options,它具有 task scheduler 属性,要么您可以在方法本身中提供一个作为重载

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 2010-10-13
    • 2018-04-16
    • 2011-10-02
    • 2014-06-06
    • 2022-08-04
    • 2011-07-20
    相关资源
    最近更新 更多