10

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

4

3 回答 3

19

System.Threading.Tasks

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


线程池

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

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


反应式扩展

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


其他

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

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


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

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

Full dislousre:顾名思义,我是 Threaot 库的作者。很抱歉缺少文档,我愿意在使用库的任何方面提供帮助。请报告任何错误,我目前(2013-06-26)在主分支中没有已知错误。

于 2013-06-26T13:02:05.403 回答
3

我不了解 Mono,但是对于 Microsoft CLR,您基本上需要自己托管 CLR 并实现相关接口。

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

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

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

于 2013-06-26T13:01:11.923 回答
2

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

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

参考这个链接。

于 2018-03-06T07:31:08.990 回答