TPL Dataflow块永远运行。永远运行生产者,消费者建模和异常处理

时间:2014-10-15 00:53:43

标签: c# .net exception-handling task-parallel-library tpl-dataflow

我正在使用TPL Dataflow库来实现生产者消费者场景。处理涉及一系列任务。数据流库非常适合我的用例。

但我想知道如何有效地实现此用例[详情如下]。

我想在服务器类型设置中使用TPL Dataflow。

通过服务器类型设置,我的意思是数据流的生成将永久地[异步]发生。消费任务也会永远运行,并消耗生产者[异步]产生的所有数据。 因此我的积木永远运行

如何有效地为此场景建模?此外,我怎么能处理异常处理,因为我不能Wait() [没有调用Wait()我无法捕捉到故障块上抛出的异常,就我的理解而言。

1 个答案:

答案 0 :(得分:0)

例外

我通常用异常处理来包装代理,因为正如你所说的那样,一个块的异常存储在Completion任务中,而且一个故障块仍然存在故障,所以你需要替换它才能继续运行。

var block = new TransfromBlock<string, int>(number =>
{
    try
    {
        return int.Parse(number);
    }
    catch (Exception e)
    {
        Trace.WriteLine(e);
    }
});

容量

另一个重要问题是封顶。如果工作流程的某些部分无法处理负载,那么它的输入队列将无限增长。这可能会导致内存泄漏或OutOfMemoryException s。因此,确保使用适当的BoundedCapacity限制所有块并确定达到该限制时要执行的操作(&#34;抛出&#34;项目,保存到存储等等)非常重要。 )

并行

虽然BoundedCapacity的默认值为-1(无界),但MaxDegreeOfPrallelism的默认值为1(无并行性)。大多数应用程序可以轻松地从并行性中受益,因此请确保设置适当的MaxDegreeOfPrallelism值。当一个块的委托纯粹是CPU密集型MaxDegreeOfPrallelism时,它不应该比可用的核心高得多。由于它具有较少的CPU和更多I / O密集型部件,MaxDegreeOfPrallelism可以增加。

结论

在整个应用程序的生命周期中使用TPL数据流非常简单。只需确保通过app.config启用配置并根据实际结果进行调整&#34;在字段&#34;。