TPL 数据流:取消

TPL Dataflow: Cancellations

当然在一长串IDataflowBlock's in the .Net library, if I want to limit the execution of the entire collection of blocks to a TimeSpan (say, 5 seconds), does it suffice if I pass a single CancellationToken in the last block's constructor (through 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 */ 是否有任何好处。

如果您希望 所有数据流块都出错,那么您应该将 CancellationToken 作为一个选项传递给每个块。或者,您可以将它作为选项传递给第一个,并在 LinkTo 中传播您的完成。我通常不会取消我的网格,但这是我通常关闭管道式网格的首选方法:link 完成,然后只完成第一个。

如果你不这样做,那么你最终会得到两个连接到一个完整块的活动块,因此添加到网格的任何项目都将流过并最终进入输出缓冲区。