我需要处理商家发送给我们的文件。每个文件名将包含商家的 ID。例如。产品 - 118763.csv,其中数字是商家 ID。
我想设置一个数据流来处理这些文件。可以同时处理多个文件。
但是,必须按顺序处理每个商家的文件。也就是说,不能同时处理特定商家的两个文件。
我不确定如何使用数据流对此进行建模。我可以监控当前正在处理哪些商家,但我不知道如何确保我不处理来自同一商家的两个文件,同时仍然尽可能多地处理文件。
看来我需要过滤我从队列中取出的东西,但我一次只能得到一个,一旦有了,然后呢。我可以重新排队,但如果只有两个文件,而且它们都来自同一个商家,那可能意味着需要重新排队。
有任何想法吗?
最佳答案
您可以创建多个 ActionBlock
s(尽可能多地并行处理),其中每个一次仅处理一个文件,并在文件名中使用 number 来选择正确的 ActionBlock
。这将允许并行处理,同时确保具有相同商家 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/