繁体   English   中英

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

[英]Writing my own IScheduler to to manage threads, what should be the best way to do this?

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

因此,我决定有一个自己的IScheduler实现,可以将其传递给ReactiveCommand构造函数,而我想做的就是拥有某种可配置的MaxThread。 这将不允许超过MaxThread线程。

我现在可以想到两种方式

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

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

有人对我们应该如何做到这一点有任何建议吗? 任何输入,代码样本,文章链接或Github / Codeplex上的任何内容都将受到赞赏。

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

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

如果不这样做,诸如ObserveOn之类的ObserveOn将为每个订阅创建一个新线程

那么,为什么不想使用DefaultScheduler,它将为您踢出ThreadPool?

另外,如果内部有一些调用ScheduleLongRunning() ,那么您确定这就是您想要的吗? 似乎您可能正在引入convoy和线程争用,这是一个工作复杂的领域。

也许您实际上想要做的是

  1. 灌注线程池,以便在需要向其添加线程时不会暂停
  2. 为您的应用程序创建更好的并发设计。 如果您有80项内容全部一次从UI调度,那么听起来有些不对劲。

我想保罗会有什么见识?

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

在代码项目上有几种ThreadPool的实现,如果您没有使用,则可以使用它们

对.NET的默认应用程序池感兴趣的人,或者您可能不喜欢在.NET中使用.NET的ThreadPool

这个情况

让我知道,如果您在实现IScheduler本身时遇到问题。

祝好运

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM