c# - 多个短期 TPL 数据流与单个长期运行的数据流

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

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

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

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

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

我看过很多关于如何在发生异常后完成数据流的文档,但很少看到关于如何从异常中恢复的文档。

最佳答案

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

在第二个选项中,使用数据流并没有比一个接一个地调用多个方法有任何附加值。还存在为每个项目创建完整数据流的开销。

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

关于c# - 多个短期 TPL 数据流与单个长期运行的数据流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23961620/

相关文章:

c# - 并行循环返回 float 之和

c# - 有延迟的链接任务

c# - 如何查询NHibernate的特定类型?

c# - 脚手架-DbContext 到不同的输出文件夹

c# - WinForms 应用程序无法在其他计算机上打开

C# - 抛出异常时无限循环?

c# - 在 C# 中创建文件路径

c# - 本地 IPEndPoint 创建的端口选择。端口号重要吗?

c# - 有没有办法区分 .NET 中的 SQL Money 和 Decimal 类型?

.net - PLINQ 有异步版本吗?