我正在使用ReactiveUI的ReactiveCommand功能,这非常酷并且可以达到目的。我遇到的唯一问题是,ReactiveCommand在实例化时需要一个IScheduler实现,目前它只提供两个MainThreadScheduler和TaskPoolScheduler,它们都允许为每个ReactiveCommand实例创建单独的线程,这是我买不起的,因为我的应用程序有大量的ReactiveCommand实例
所以我决定拥有自己的IScheduler实现,我可以传递给ReactiveCommand构造函数,我想要做的是有一些可配置的MaxThread;这将不允许超过MaxThread线程。
我现在可以想到两种方式
每当应用程序启动时,启动这些线程并将它们置于等待状态,尝试从ActionBlock中删除任务,调用Schedule时,将该Action对象添加到ActionBlock实例。
创建和销毁,基本上与1相同但是一旦任务完成,就结束线程而不是保持活动。
有人对我们应该如何做到这一点有任何建议吗?任何输入,代码示例,文章链接或Github / Codeplex上的东西都将不胜感激。
答案 0 :(得分:2)
如果您不想在默认调度程序上的长时间运行的任务上启动新线程,那么您可以使用默认调度程序,并禁用ISchedulerLongRunning
优化,如下所示:
Scheduler.Default.DisableOptimizations(typeof(ISchedulerLongRunning));
如果您不这样做,ObserveOn
之类的内容会为每个订阅创建一个新帖子
答案 1 :(得分:1)
那你为什么不想使用DefaultScheduler,它会为你开出一个ThreadPool?
此外,如果内部正在调用ScheduleLongRunning()
,您确定这是您想要的吗?看起来你可能会引入一个convoys和线程争用,这是一个复杂的领域。
也许你真正要做的就是
我想保罗会有一些见解吗?
答案 2 :(得分:0)
使用.NET的ThreadPool实现IScheduler,并轻松设置ThreadPool的最大线程。
在代码项目中有几个ThreadPool实现,如果你不是
,可以使用它们对.NET的默认应用程序池感兴趣,或者您可能不想在
中使用.NET的ThreadPool这种情况
请告诉我,如果您在实施IScheduler时遇到问题。
祝你好运