TPL数据流 - 在任何时候控制流中的项目

时间:2014-07-18 18:07:25

标签: c# .net queue task-parallel-library tpl-dataflow

我需要处理商家发送给我们的文件。每个文件名都包含商家的ID。例如。产品 - 118763.csv,其中号码是商家ID。

我想设置一个数据流来处理这些文件。可以同时处理多个文件。

但是,必须按顺序处理每个商家的文件。也就是说,不能同时处理特定商家的两个文件。

我不确定如何使用数据流对此进行建模。我可以监控当前正在处理哪些商家,但我不知道如何确保我不处理来自同一商家的两个文件,同时仍然尽可能多地处理多个文件。

似乎我需要过滤掉从队列中取出的内容,但我一次只能获得一个项目,一旦我拥有,那么当然。我可以重新排队,但如果只有两个文件,这可能意味着很多重新排队,而且他们都来自同一个商家。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以创建多个ActionBlock(尽可能多地并行处理),其中每个只能处理一个文件,并使用文件名中的数字来选择正确的{{1 }}。这将允许并行处理,同时确保具有相同商家ID的文件按顺序处理。

初始化:

ActionBlock

用法:

_actionBlocks = new ActionBlock<File>[DegreeOfParallelism];
for (var i = 0; i < _actionBlocks.Length; i++)
{
    _actionBlocks[i] = new ActionBlock<File>(file => ProcessFile(file));
}