【发布时间】:2019-07-29 16:39:35
【问题描述】:
我是 TPL Dataflow 的新手,我可以使用它,但我不确定我是否正确使用它。我有一个输入(字符串)列表,我想以最大程度的并行度处理它们(全部),并知道它什么时候完成。现在我只是通过输入foreach 并在ActionBlock 上调用Post,忽略返回值。这似乎不正确,因为它可能会丢失输入。
我的问题是:如何避免丢失物品?是否有一个内置块,我可以只给我的输入,它会确保它们都被尝试? (无论每次输入成功/失败。)
我看到的建议基本上是:
await block.Completion;
这是否会导致输入失败(Post 或 SendAsync 将返回 false)?对我来说奇怪的是,似乎这个决定是在我打电话给Post 而不是之后做出的,所以这个Completion 甚至不包括这些项目。
我觉得我基本上需要一个重试循环来处理以前无法处理的输入,类似于:
while (items.Count > 0) {
foreach (var item in items) {
if (await block.SendAsync(item)) {
items.Remove(item);
}
}
await block.Completion;
}
block.Complete();
(除了更好的循环处理/错误检查。)
这个额外的级别是不必要的吗?还是我在概念上的某个地方错了?
【问题讨论】:
标签: c# tpl-dataflow