1

我正在寻找适合这种情况的模式。

我需要以这种方式从 HDD 处理文件。

  1. 加载文件
  2. 分析文件
  3. 根据分析结果验证文件
  4. 根据验证结果将文件导入应用程序

这个过程将来可能会改变。

我的想法是为每个文件操作(命令模式)创建命令。

  • 加载文件命令:IFileCommand
  • 分析文件命令:IFileCommand
  • 验证文件命令:IFileCommand
  • 导入文件命令:IFileCommand

代码:

public interface IFileCommand
{
  FileCommandResult Execute();
  void Abort();
}
public class FileCommandResult
{ 
  FileInfo File{get;}
  bool Sucesss{get;}
  string Error{get;}
}

我需要使用命令创建进程(命令链)。

我尝试为此目的使用责任链模式,但可能存在更好的模式或设计。

如果可能的话,我想使用 Rx 并且并行执行也会很好。

我想实现这一点:

var data = new List<FileInfo>();

var process = new List<IFileCommand>{new LoadFileCommand(), new AnalyzeFileCommand(), new ValidateFileCommand(), new ImportFileCommand()};

var processor = new FileProcessor();

IEnumerable<IFileCommandResult> results = processor.Execute(process, data);

有任何想法吗。

4

1 回答 1

1

为什么要为此使用 Rx?如果您想将您的操作表示为一系列命令,那么只需使用 LINQ 来应用命令链。如果您希望它们并行运行,那么只需使用 PLINQ、TPL 或 Parallel.ForEach。您还可以查看TPL Dataflow

这里有3种方法可以解决您的问题。注意我没有实现错误处理或弄乱你的Abort方法,我对你的方法采取了一些自由,Execute因为你所拥有的东西是不可用的。我现在假设Execute有这个签名:FileInfo Execute(FileInfo)如果失败,它会抛出异常。

IEnumerable<FileInfo> data = ...;
IEnumerable<IFileCommand> process = ...;

// PLINQ
var results = data
    .AsParallel()
    .Select(dataItem => process.Aggregate(dataItem, (d, p) => p.Execute(d)))
    .ForAll(dataItem => import(dataItem));


// Parallel.Foreach
Parallel.Foreach(data, dataItem => import(process.Aggregate(dataItem, (d, p) => p.Execute(d))));

// TPL
var tasks = data
    .Select(dataItem => Task.Run(() => import(process.Aggregate(dataItem, (d, p) => p.Execute(d)))));
await Task.WhenAll(tasks);
于 2014-12-29T20:57:56.493 回答