Почему мой поток данных TPL зависает при связывании трех исходных блоков с одним целевым блоком действия? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть три разных 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 приводит к зависанию приложения. Есть идеи, что здесь может происходить или чего мне не хватает?

...