TPL数据流:取消

时间:2019-04-28 19:44:56

标签: c# task-parallel-library tpl-dataflow

.Net库中一长串IDataflowBlock的列表中,如果我想将整个块集合的执行限制为一个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 个答案:

答案 0 :(得分:1)

如果您想要所有数据流模块出现故障,则应将CancellationToken作为选项传递给每个模块。另外,您可以将其作为选项传递给第一个,然后在LinkTo中传播完成。我通常不取消网格,但这是关闭管道式网格的首选方法:先链接完成,然后再完成第一个。

如果不这样做,最终将有两个活动块连接到一个完整的块,因此添加到网格中的所有项目都将流过并最终到达输出缓冲区。