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

问题描述 投票:6回答:3

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

c# .net multithreading
3个回答
13
投票

System.Threading.Tasks

如果你引用System.Threading.Tasks那么你需要的是继承TaskScheduler然后你可以使用你的类的一个对象来初始化TaskFactory。 MSDN中有一个example。我也发现了一个example in the blog psyCodeDeveloper


线程池

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

为此,您可能对CodeProject(part 1part 2part 3)上的Understanding SynchronizationContext系列感兴趣。


反应性扩展

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


其他

当然你可以滚动your own thread pool,虽然不建议这样做。除此之外,你可以手动处理你的线程 - 旧的方式。

处理任务的其他方法包括scheduling with timers和有专门的线程来完成工作。


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

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

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


2
投票

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

有关更多信息,请参阅this blog entry

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

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


0
投票

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

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

请参阅this链接。

© www.soinside.com 2019 - 2024. All rights reserved.