多个短期TPL数据流与单个长期运行流

时间:2014-05-30 18:56:34

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

我正在使用TPL数据流处理Azure辅助角色中的队列中的项目。我应该有一个长时间运行的数据流,还是为我收到的每封邮件生成一个新流?

如果块中抛出错误,该块将停止接受新消息。这意味着如果块中存在异常,则整个数据流将停止处理。

我需要能够在不锁定数据流的情况下承受无效队列输入等异常。我看到两个选项之一:

  1. 我启动了一个数据流,并在它们离开队列时向它发送消息。每个块的内容都包含在try-catch块中,该块记录异常,然后继续处理。这看起来很笨拙,我认为有更好的方法。
  2. 对于每条消息,我启动一个新的数据流并处理队列消息。如果在任何块中抛出异常,数据流将完成,我只恢复单个消息。我见过的大多数数据流示例都发送了多条消息,所以这也感觉不对。
  3. 我见过很多关于如何在异常后完成数据流的文档,但很少有关于如何从异常中恢复的文档。

1 个答案:

答案 0 :(得分:1)

你绝对应该选择第一个选项并且只有一个流程。

在第二个选项中,使用数据流而不是一个接一个地调用多个方法没有任何附加价值。为每个项目创建完整的数据流也会产生开销。

最好一次构建流程,并在整个应用程序的生命周期中使用它。我不认为处理每个块的异常有什么问题,但是如果你想让整个流程失败并且只创建一个新的。