【问题标题】:How to make my custom TaskScheduler the default one如何将我的自定义 TaskScheduler 设为默认值
【发布时间】:2014-06-09 12:49:42
【问题描述】:

我有自己的TaskScheduler 实现。它存在的主要原因是它将处理器核心关联设置到运行我的任务的线程。

当我以下列方式使用它时:

var myTaskSceduler = new MyTaskScheduler(4);
var taskFactory = new TaskFactory(myTaskSceduler);
taskFactory.StartNew(DoSomething);

亲和力工作正常,任务将只在指定的核心上运行。

如何更改 Task.Factory 或 Task.Factory.Scheduler 以便我的调度程序将成为默认调度程序

 Task.Factory.StartNew()

正在被调用?

【问题讨论】:

  • 你不能。 Task.Factory 和 TaskScheduler.Default 由静态只读字段支持。可以设置TaskFactory 的默认调度程序的唯一方法是通过其构造函数。

标签: c# .net multithreading asynchronous async-await


【解决方案1】:

为什么不创建自己的静态方法MyTask.StartNew()?无论如何,您不必将亲和力指定为参数吗?

在任何情况下,任务工厂都应该使用与您调用StartNew 时相同的调度程序。因此,如果您对正确调度程序上的任务执行此操作,它应该可以正常工作。这实际上取决于您如何处理您的处理调度等,但我假设如果您不打算在任何地方传递亲和力,那么您无论如何都会依赖于上下文。

【讨论】:

  • 实际上我需要它,所以我的 async/await 方法创建的所有任务都将使用我的调度程序进行调度。没有要传递的参数,affinity 暂时是硬编码的
  • @HadarGrubman 啊。在这种情况下,只需确保您正在等待正确的父任务(在您想要的调度程序上启动),它应该可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2017-12-21
  • 2021-08-22
  • 2021-10-13
  • 1970-01-01
  • 2020-01-29
相关资源
最近更新 更多