c# - TPL 数据流 - 随时控制流中的项目

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

我需要处理商家发送给我们的文件。每个文件名都将包含商家的 ID。例如。 Products - 118763.csv,其中数字为商家 ID。

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

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

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

看来我需要过滤我从队列中取出的东西,但我一次只能得到一个项目,一旦我有,然后呢。我可以重新排队,但如果只有两个文件并且它们都来自同一商家,那可能意味着需要大量重新排队。

有什么想法吗?

最佳答案

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

初始化:

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

用法:

void ProcessFile(string path)
{
    _actionBlocks[(uint) int.Parse(Path.GetFileNameWithoutExtension(path))%_actionBlocks.Length].Post(
        ReadFile(path));
}

关于c# - TPL 数据流 - 随时控制流中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24831239/

相关文章:

c# - 将数据从 View 绑定(bind)到 ItemsPanelTemplate

c# - 在 Visual Studio 中着色实例变量

python - 是否可以在 RabbitMQ 队列之间移动/合并消息?

javascript - 是否可以在 Kue Node.js 中更新已创建的作业?

c# linq 相当复杂的排序

c# - 模型中的 Display 属性是否违反了关注点与 View 和模型的分离

c# - 在 C# 中使用属性获取和设置字段

.net - WCF中WSDualHttpBinding的优势是什么?

c# - 在 .NET 中,即使对象的构造函数从未运行过,终结器也可以运行吗?

c - .h注释: previous declaration of 'QueueADT' was here typedef struct { } *QueueADT;