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

Der*_*unk 8 .net c# multithreading

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

The*_*aot 16

System.Threading.Tasks

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


线程池

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

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


反应性扩展

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


其他

当然,您可以滚动自己的线程池,但不建议这样做.除此之外,你可以手动处理你的线程 - 旧的方式.

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


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

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

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