编写我自己的 IScheduler 来管理线程,最好的方法应该是什么
本文关键字:方法 是什么 线程 我自己 自己的 IScheduler 管理 | 更新日期: 2023-09-27 18:30:31
我正在使用ReactiveUI的ReactiveCommand功能,该功能非常酷并且可以达到目的。我遇到的唯一问题是,实例化的ReactiveCommand需要一个IScheduler实现,目前它只提供两个MainThreadScheduler和TaskPoolScheduler,它们都允许为每个ReactiveCommand实例创建单独的线程,这是我负担不起的,因为我的应用程序有大量的ReactiveCommand实例。
所以我决定拥有自己的IScheduler实现,我可以传递给ReactiveCommand构造函数,我想做的是拥有某种可配置的MaxThread;它不会允许超过MaxThread线程。
我能想到的有两种方式,或者现在
-
每当应用程序启动时,启动这些线程并将它们置于等待状态,尝试从 ActionBlock 中删除任务,调用 Schedule 时,将该 Action 对象添加到 ActionBlock 实例。
-
创建和销毁,基本上与 1 相同,但一旦任务完成,结束线程而不是使其保持活动状态。
有人对我们应该如何实现这一目标有任何建议吗?任何输入,代码示例,文章链接或Github/Codeplex上的内容将不胜感激。
如果您不想在默认调度程序上对长时间运行的任务启动新线程,那么您可以使用禁用ISchedulerLongRunning
优化的默认调度程序,如下所示:
Scheduler.Default.DisableOptimizations(typeof(ISchedulerLongRunning));
如果您不这样做,ObserveOn
之类的事情将为每个订阅创建一个新线程
那么为什么你不想使用DefaultScheduler,它会为你踢到一个ThreadPool呢?
另外,如果内部有东西在召唤ScheduleLongRunning()
,你确定这是你想要的吗?似乎您可以引入车队和线程争用,这是一个复杂的工作领域。
也许你真正想做的是要么
- 启动您的线程池,以便在需要向其添加线程时不会暂停
- 为应用程序创建更好的并发设计。如果你有 80 件事一次从 UI 中调度,听起来有些不太对劲。
我想保罗会有一些洞察力吗?
使用 .NET 的 ThreadPool 实现 IScheduler,并轻松设置 ThreadPool 的最大线程数。
代码项目上有几种 ThreadPool 的实现,如果您不是,您可以使用它们
对 .NET 的默认应用程序池感兴趣,或者您可能不喜欢在
这种情况
让我知道,如果您在实现 IScheduler 本身时遇到问题。
祝你好运