用定制的调度程序替换C#中的任务调度程序

本文关键字:任务调度程序 替换 调度程序 | 更新日期: 2023-09-27 18:19:54

我想知道是否可以使用C#更改将任务映射到.NET中真实操作系统线程的任务调度程序,或者是否需要重新编译Mono运行时来完成此操作。谢谢

用定制的调度程序替换C#中的任务调度程序

系统线程。任务

如果您引用System.Threading.Tasks,那么您需要的是将TaskScheduler子类化,然后您可以使用类的对象来初始化TaskFactory。MSDN中有一个例子。我还在博客psyCodeDeveloper中找到了一个例子。


线程池

除此之外,您还可以使用SynchronizationContext来处理发布到ThreadPool的任务(例如ThreadPool.QueueUserWorkItem)的处理方式。

为此,您可能对理解CodeProject中的同步上下文系列(第1部分、第2部分和第3部分)感兴趣。


反应式扩展

至于Reactive Extensions中的自定义调度器,您也可以使用上面提到的SynchronizationContext,有关更多信息,请查看introtorx.com上的教程,特别是第4部分:并发。


其他

当然,您可以滚动自己的线程池,尽管不建议这样做。除此之外,您还可以手动处理线程——用老方法。

处理任务的其他方法包括使用定时器进行调度和使用专用线程来完成工作。


作为Theraot库的一部分,您会发现Work类基于无锁队列,可以配置为具有任意数量的专用线程,等待任务的线程也会贡献时间来执行任务,任何额外的工作都会委托给ThreadPool。这是正在进行的将System.Threading.Tasks后台移植到.NET 2.0的工作的一部分。

在Theraot Libraries中,Work类已经消失了一段时间,.NET 2.0的System.Threading.Tasks的部分后端支持自定义TaskScheduler。

完全讨论:正如这个缺乏想象力的名字所暗示的那样,我是Threaot图书馆的作者。很抱歉缺少文档,我愿意在使用库的任何方面提供帮助。请报告任何错误,我目前(2013-06-26)在master分支中没有已知的错误。

我不知道Mono,但使用Microsoft CLR,您基本上需要自己托管CLR并实现相关接口。

有关详细信息,请参阅此博客条目。

请注意,无论如何,这是一个非常复杂的主题。该功能最初仅集成在.NET 2.0中,因此Microsoft SQL Server(具有光纤模式)可以将CLR线程映射到光纤,而不是映射到操作系统线程。AFAIK;实验";然而,被认为是大失败。

还要注意,许多.NET(托管)代码隐式地(或通过对Windows API的p/Invoke调用显式地)假设CLR和OS线程之间的映射实际上是1:1。

是的,你可以!您可以通过扩展.Net framework 4.0提供的默认任务调度程序的功能来构建自己的自定义任务调度程序。

因此,要构建自定义任务调度程序,需要扩展System.Threading.Tasks.TaskScheduler抽象类并重写以下方法。-队列任务-GetScheduledTasks
-TryExecuteTaskInline

请参阅此链接。