【问题标题】:Can a C# TPL dataflow propagate completion upstream?C# TPL 数据流能否向上游传播完成?
【发布时间】:2020-02-11 17:46:06
【问题描述】:

链接数据流块时,您可以选择“传播完成”设置。这实质上是将完成从源传播到目标。

但是,我有一个应用程序,从数据库中提取数据并且下游块正在监视某些条件是否为真。当达到这个条件时,我想杀死数据流。本质上,我希望我的下游块向上游传播完成。

我将如何使用 TPL 数据流来做到这一点?

【问题讨论】:

  • 也许你应该给你的下游块引入副作用,所以当满足条件时,它只会生成上游块正在监听的“关闭事件”之类的东西。换句话说,上游块被通知它应该完成数据流管道/网络。
  • @BART 这就是我想做的事情。让下游持有对上游块的引用,然后对其调用 Complete 方法。
  • 你希望这个完成有多突然? CancellationToken 将中止所有块,丢弃所有缓冲数据

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


【解决方案1】:

杀死数据流的最安全和直接的方法是将取消令牌传递给所有块,然后取消令牌。这比在生产者块中调用Complete(),然后等待最后的项目被处理更直接。

var cts = new CancellationTokenSource();

var producer = new BufferBlock<X>(new DataflowBlockOptions()
{
    CancellationToken = cts.Token
});

// ...

cts.Cancel();

【讨论】:

  • 在我的用例中,最后一个数据流块控制取消。将取消令牌源传递给块本身会是不好的做法吗?
  • @Izzo 将 CancellationTokenSource 传递给数据流块是不可能的。您只能传递CancellationToken。您可以将相同的CancellationToken 传递给管道的所有块(这是我的建议)。
  • 因为我的最后一个数据流块负责标记完成,并且我无法将取消令牌控制权交给数据流块,所以这种方法将如何工作?
猜你喜欢
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多