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

标签 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 相同,但一旦任务完成,就结束线程而不是保持其事件状态。

有人对我们应该如何实现这一目标有任何建议吗?任何输入、代码示例、文章链接或 Github/Codeplex 上的内容都将受到赞赏。

最佳答案

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

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

如果您不这样做,ObserveOn 等内容将为每个订阅创建一个新线程

关于c# - 编写我自己的 IScheduler 来管理线程,最好的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18681792/

相关文章:

java - 是使用线程从服务器获取数据并更新 ListView 的正确方法

c# - 从默认 "Application1"名称更改项目名称

c# - 使用 MVVM 模式访问模型的最佳实践是什么

c# - 从多个一维高效地创建矩形二维阵列

multithreading - 彼得森的算法如何在不做出不切实际的假设的情况下工作?

.net - 将 Observable<Timestamp<T>> 转换为 Observable<Time Interval<T>>

c# - 我希望能够在内部派生自一个类,但不允许其他程序集中的类派生自该类

java - Thread.currentThread().getId() 和 Kernel32.INSTANCE.GetCurrentThreadId() 之间的区别

c# - 等待 IObservable 获取所有元素错误

system.reactive - 为什么 RX 的 BehaviorSubject 中的名称为 "Behavior"?