.net - 可以将同一驱动器上的文件操作批处理到同一线程的线程调度程序?

标签 .net parallel-processing system.reactive

我想使用 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/

相关文章:

c# - 你如何摆脱 C# 中的对象

c# - 使用反射调用 Enumerable.Where(或其他重载的泛型方法)

r - 在 R 中使用 %dopar% 而不是 %do% 时出错(包 doParallel)

linux - 在 clearcase 环境中启动并行 bsub 作业

c# - 如何创建一个 Observable Timer,它调用一个方法并在该方法运行到完成时阻止取消?

c# - 使用 C# 下载文件

c# - 如何只查找同时具有 getter 和 setter 的属性?

c# - lambda 表达式是多线程的吗?

c# - 我怎样才能用响应式扩展解决这个问题?

c# - 使用 System.Reactive.Linq 订阅第一个事件发生并取消