.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 */
注释是否对您有好处?
答案 0 :(得分:1)
如果您想要所有数据流模块出现故障,则应将CancellationToken
作为选项传递给每个模块。另外,您可以将其作为选项传递给第一个,然后在LinkTo
中传播完成。我通常不取消网格,但这是关闭管道式网格的首选方法:先链接完成,然后再完成第一个。
如果不这样做,最终将有两个活动块连接到一个完整的块,因此添加到网格中的所有项目都将流过并最终到达输出缓冲区。