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 完成,然后只完成第一个。
如果你不这样做,那么你最终会得到两个连接到一个完整块的活动块,因此添加到网格的任何项目都将流过并最终进入输出缓冲区。
当然在一长串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 完成,然后只完成第一个。
如果你不这样做,那么你最终会得到两个连接到一个完整块的活动块,因此添加到网格的任何项目都将流过并最终进入输出缓冲区。