2

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

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

我现在可以想到两种方式

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

  2. Create and Destroy,与1基本相同,但是一旦任务完成,就结束线程而不是让它保持活动状态。

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

4

3 回答 3

2

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

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

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

于 2016-02-15T09:12:09.510 回答
1

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

另外,如果内部有东西在调用ScheduleLongRunning(),你确定这就是你想要的吗?看起来您可能会引入车队和线程争用,这是一个复杂的工作领域。

也许您实际上想要做的是

  1. 准备好你的线程池,这样你就不会在需要向它添加线程时暂停
  2. 为您的应用程序创建更好的并发设计。如果你一次有 80 件事情从 UI 中调度,听起来有些事情不太对劲。

我想保罗会有一些见识?

于 2013-09-08T22:04:46.797 回答
0

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

代码项目上有几个ThreadPool的实现,如果你没有,你可以使用它们

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

这个情况

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

祝你好运

于 2013-09-08T08:22:30.587 回答