Can a C# TPL dataflow propagate completion upstream?
链接数据流块时,您可以选择"传播完成"设置。这实质上是将完成从源传播到目标。
但是,我有一个应用程序,从数据库中提取数据并且下游块正在监视某些条件是否为真。当达到这个条件时,我想杀死数据流。本质上,我希望我的下游块向上游传播完成。
我将如何使用 TPL 数据流来做到这一点?
- 也许您应该为下游块引入副作用,因此当满足条件时,它只会生成上游块正在侦听的关闭事件。换句话说,上游块被通知它应该完成数据流管道/网络。
-
@BART 这就是我想做的事情。让下游持有对上游块的引用,然后对其调用 Complete 方法。
-
你希望这个完成有多突然? CancellationToken 将中止所有块,丢弃所有缓冲数据
杀死数据流的最安全和直接的方法是将取消令牌传递给所有块,然后取消令牌。它比调用 Complete() 到生产者块,然后等待最后的项目被处理更直接。
1 2 3 4 5 6 7 8 9 10
| var cts = new CancellationTokenSource ();
var producer = new BufferBlock <X >(new DataflowBlockOptions ()
{
CancellationToken = cts .Token
});
// ...
cts .Cancel(); |
- 在我的用例中,最后一个数据流块控制取消。将取消令牌源传递给块本身会是不好的做法吗?
-
@Izzo 将 CancellationTokenSource 传递给数据流块是不可能的。你只能传递一个 CancellationToken。您可以将相同的 CancellationToken 传递给管道的所有块(这是我的建议)。
-
因为我的最后一个数据流块负责标记完成,并且我无法将取消令牌控制权交给数据流块,所以这种方法将如何工作?