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

本文关键字:方法 是什么 线程 我自己 自己的 IScheduler 管理 | 更新日期: 2023-09-27 18:30:31

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

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

我能想到的有两种方式,或者现在

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

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

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

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

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

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

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

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

另外,如果内部有东西在召唤ScheduleLongRunning(),你确定这是你想要的吗?似乎您可以引入车队和线程争用,这是一个复杂的工作领域。

也许你真正想做的是要么

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

我想保罗会有一些洞察力吗?

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

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

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

这种情况

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

祝你好运