Я новичок в TPL Dataflow, и у меня он работает, но я не уверен, правильно ли я его использую. У меня есть список входных данных (строк), и я хочу обработать их (все) с максимальной степенью параллелизма и знать, когда все это будет завершено. Прямо сейчас я просто foreach
просматриваю входы и вызываю Post
на ActionBlock
, игнорируя возвращаемое значение. Это кажется неправильным, так как входные данные могут быть пропущены.
У меня вопрос: как избежать пропуска предметов? Есть ли встроенный блок, в который я могу просто дать свои входные данные, и он будет следить за тем, чтобы все они были выполнены? (Независимо от успеха / неудачи на ввод.)
Предложения, которые я видел, в основном сводятся к:
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();
(За исключением улучшенной обработки цикла / проверки ошибок.)
Этот дополнительный уровень не нужен? Или я где-то концептуально ошибаюсь?