编写自己的IScheduler来管理线程,最好的方法是什么?

时间:2013-09-08 08:16:22

标签: c# multithreading system.reactive reactive-programming reactiveui

我正在使用ReactiveUI的ReactiveCommand功能,这非常酷并且可以达到目的。我遇到的唯一问题是,ReactiveCommand在实例化时需要一个IScheduler实现,目前它只提供两个MainThreadScheduler和TaskPoolScheduler,它们都允许为每个ReactiveCommand实例创建单独的线程,这是我买不起的,因为我的应用程序有大量的ReactiveCommand实例

所以我决定拥有自己的IScheduler实现,我可以传递给ReactiveCommand构造函数,我想要做的是有一些可配置的MaxThread;这将不允许超过MaxThread线程。

我现在可以想到两种方式

  1. 每当应用程序启动时,启动这些线程并将它们置于等待状态,尝试从ActionBlock中删除任务,调用Schedule时,将该Action对象添加到ActionBlock实例。

  2. 创建和销毁,基本上与1相同但是一旦任务完成,就结束线程而不是保持活动。

  3. 有人对我们应该如何做到这一点有任何建议吗?任何输入,代码示例,文章链接或Github / Codeplex上的东西都将不胜感激。

3 个答案:

答案 0 :(得分:2)

如果您不想在默认调度程序上的长时间运行的任务上启动新线程,那么您可以使用默认调度程序,并禁用ISchedulerLongRunning优化,如下所示:

Scheduler.Default.DisableOptimizations(typeof(ISchedulerLongRunning));

如果您不这样做,ObserveOn之类的内容会为每个订阅创建一个新帖子

答案 1 :(得分:1)

那你为什么不想使用DefaultScheduler,它会为你开出一个ThreadPool?

此外,如果内部正在调用ScheduleLongRunning(),您确定这是您想要的吗?看起来你可能会引入一个convoys和线程争用,这是一个复杂的领域。

也许你真正要做的就是

  1. 填充你的线程池,以便在需要向其添加线程时不会暂停
  2. 为您的应用程序创建更好的并发设计。如果你有80个东西,所有的调度都是一次性的UI,那听起来好像不太对劲。
  3. 我想保罗会有一些见解吗?

答案 2 :(得分:0)

使用.NET的ThreadPool实现IScheduler,并轻松设置ThreadPool的最大线程。

在代码项目中有几个ThreadPool实现,如果你不是

,可以使用它们

对.NET的默认应用程序池感兴趣,或者您可能不想在

中使用.NET的ThreadPool

这种情况

请告诉我,如果您在实施IScheduler时遇到问题。

祝你好运