Как я могу остановить обработку блоков DataFlow, если один из блоков решил, что произошла ошибка, препятствующая запуску следующих блоков. Я думал, что блок может генерировать исключение, но не уверен, как правильно остановить дальнейшую обработку конвейера.
ОБНОВИТЬ:
private async void buttonDataFlow_Click(object sender, EventArgs e)
{
var cells = objectListView.CheckedObjects.Cast<Cell>().ToList();
if (cells == null)
return;
var blockPrepare = new TransformBlock<Cell, Cell>(new Func<Cell, Task<Cell>>(Prepare),
new ExecutionDataflowBlockOptions
{
BoundedCapacity = 10000,
MaxDegreeOfParallelism = Environment.ProcessorCount,
});
var blockPreparationFeedback = new TransformBlock<Cell, Cell>(new Func<Cell, Task<Cell>>(PreparationFeedback),
new ExecutionDataflowBlockOptions
{
BoundedCapacity = 10000,
MaxDegreeOfParallelism = Environment.ProcessorCount,
});
var blockTestMover = new ActionBlock<Cell>(new Func<Cell, Task>(TestMover),
new ExecutionDataflowBlockOptions
{
BoundedCapacity = 10000,
MaxDegreeOfParallelism = Environment.ProcessorCount,
});
blockPrepare.LinkTo(blockPreparationFeedback, new DataflowLinkOptions { PropagateCompletion = true });
blockPreparationFeedback.LinkTo(blockTestMover, new DataflowLinkOptions { PropagateCompletion = true });
foreach (Cell c in cells)
{
var progressHandler = new Progress<string>(value =>
{
c.Status = value;
});
c.Progress = progressHandler as IProgress<string>;
blockPrepare.Post(c);
};
blockPrepare.Complete();
try
{
await blockTestMover.Completion;
}
catch(Exception ee)
{
Console.WriteLine(ee.Message);
}
Console.WriteLine("Done");
}
ОБНОВЛЕНИЕ 2:
public ITargetBlock<TInput> CreateExceptionCatchingActionBlock<TInput>(
Func<TInput, Task> action,
Action<Exception> exceptionHandler,
ExecutionDataflowBlockOptions dataflowBlockOptions)
{
return new ActionBlock<TInput>(async input =>
{
try
{
await action(input);
}
catch (Exception ex)
{
exceptionHandler(ex);
}
}, dataflowBlockOptions);
}
Try
. Это позволяет передать сообщение через все блоки конвейера, а затем наблюдать за любым исключением, которое произошло с этим сообщением в конце. - person Theodor Zoulias   schedule 26.06.2020