У меня есть три разных TransformBlock
, которые принимают разные входные данные, но выдают 3 производных одного и того же абстрактного класса, скажем, AbstractBaseResult
. Этот AbstractBaseResult
имеет свойство под названием IsSuccess
, которое можно фильтровать.
Вот приблизительный эквивалентный код:
public abstract class AbstractBaseResult
{
public bool IsSuccess {get; set;}
public Exception Error {get; set;}
}
// For brevity I cannot include it here, but block1 and block2 are second/third generation predecessors of block3 in this dataflow
var block1 = new TransformBlock<Input1, DerivedResult1>(...);
var block2 = new TransformBlock<Input2, DerivedResult2>(...);
var block3 = new TransformBlock<Input3, DerivedResult3>(...);
var batchBlock = new BatchBlock<DerivedResult3>(1000);
var dataflowLinkOptions = new DataflowLinkOptions { PropagateCompletion = true };
block3.LinkTo(batchBlock, dataflowLinkOptions, x => x.IsSuccess);
var failures = new ConcurrentBag<Exception>();
var failBlock = new ActionBlock<AbstractBaseResult>(x => failures.Add(x.Error));
block1.LinkTo(failBlock, dataflowLinkOptions, x => !x.IsSuccess);
block2.LinkTo(failBlock, dataflowLinkOptions, x => !x.IsSuccess);
block3.LinkTo(failBlock, dataflowLinkOptions, x => !x.IsSuccess);
Если я закомментирую block1
/ block2
связывание на failBlock
, тогда приложение работает нормально. Однако, если все 3 связаны, то условие сбоя на block3
приводит к зависанию приложения. Есть идеи, что здесь может происходить или чего мне не хватает?