用自定义构建的C#替换C#中的任务调度程序

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

System.Threading.Tasks

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


线程池

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

为此您可能对CodeProject中的Understanding SynchronizationContext系列感兴趣( 第1 部分 , 第2 部分和第3部分 )。


react native扩展

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


其他

当然,你可以推出自己的线程池 ,但不建议这样做。 除此之外,你可以手动处理你的线程 – 旧的方式。

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


作为Theraot库的一部分,您将找到基于无锁队列的类Work ,可以配置为具有任意数量的专用线程,等待任务的线程也有时间执行任务,任何额外的工作都委托给ThreadPool。 这是将System.Threading.Tasks反向移植到.NET 2.0的持续努力的一部分。

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

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

我不了解Mono,但是使用Microsoft CLR,你需要自己主持CLR并实现相关的接口。

有关更多信息,请参阅此博客条目 。

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

另请注意,许多.NET(托管)代码隐式(或通过P / Invoke调用Windows API)假定CLR和OS线程之间的映射实际上是1:1。

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

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

请参阅此链接。