Поток данных TPL: аннулирование - PullRequest
1 голос
/ 28 апреля 2019

В длинном списке IDataflowBlock в библиотеке .Net, если я хочу ограничить выполнение всей коллекции блоков TimeSpan (скажем, 5 секунд), достаточно ли этого, если Я передаю один CancellationToken в конструкторе последнего блока (через DataflowBlockOptions конечно)?

Я думаю, что вопрос стоит сам по себе, но для некоторого контекста, например:

var token = new CancellationToken(5000);
var options = new DataflowBlockOptions{ CancellationToken = token };

// DataflowBlockOptions not used although possible through overloading
var block1 = new Bufferblock<int>(/*options*/);

// DataflowBlockOptions not used although possible through overloading
var block2 = new TransformBlock<int,int>(i => i + 1/*, options*/);

// Options used here to limit total time to 5 seconds.
var block3 = new ActionBlock<int>(i => Console.WriteLine(i), options);

block1.LinkTo(block2);
block2.LinkTo(block3);

block1.Post(...)

await block3.Completion;

Еще один способ задать вопрос: есть ли здесь какая-то выгода, чтобы раскомментировать /* options */ в приведенном выше фрагменте.

1 Ответ

1 голос
/ 29 апреля 2019

Если вы хотите, чтобы все ваши блоки потока данных вышли из строя, вы должны передать CancellationToken в качестве опции каждому. Кроме того, вы можете передать его в качестве опции для первого и распространить свое завершение в LinkTo. Обычно я не отменяю свои сетки, но это мой предпочтительный подход к закрытию конвейерных сеток в целом: связать с завершением, а затем просто завершить первый.

Если вы этого не сделаете, то в итоге у вас будет два живых блока, подключенных к завершенному блоку, поэтому любые элементы, добавленные в сетку, будут проходить и попадать в выходной буфер.

...