我想使用 Rx 扩展来处理长文件绑定(bind)操作的并行化。
工作流程是这样的:
- 在多个驱动器上搜索给定的文件模式(假设每个驱动器都在单独的物理设备上)
- 对于找到的每个匹配文件,将长文件操作排队到与同一驱动器上的其他文件相同的线程 - 希望最大限度地减少随机查找。
- 对不同驱动器上的文件的操作应该排队到不同的线程以允许并行处理。
我的问题是:我应该使用哪种 Rx 调度器(或调度器组合)?
最佳答案
为此,认识到每个 Rx 可观察订阅串行工作是非常有用的。也就是说,对于单个可观察对象的单个订阅,您可以确保一个项目的 onNext
委托(delegate)在下一个项目的 onNext
开始之前完成。
默认情况下,onNext
委托(delegate)在当前线程(调用 OnNext()
的线程)上执行,但您可以使用 ObserveOn 更改它()
。
这对您来说意味着您应该为每个物理驱动器创建一个单独的可观察对象,并在单独的线程上观察每个对象。如果要执行单个可观察操作,一种方法是使用 GroupBy()
。
使用哪个特定的调度程序?我认为这无关紧要。 ObserveOn()
似乎使用 ScheduleLongRunning()
(如果它可用),这对于最常见的调度程序来说意味着它将创建一个新线程用于观察。
将所有这些放在一起,您的代码可能类似于:
operations.GroupBy(op => op.Drive)
.Select(o => o.ObserveOn(TaskPoolScheduler.Default))
.Do(o => o.Subscribe(op => op.Execute()))
.Subscribe();
(假设 operations
可观察到您的操作类型,它具有 Drive
属性和 Execute()
方法。)
关于.net - 可以将同一驱动器上的文件操作批处理到同一线程的线程调度程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15823168/