我正在使用TPL Dataflow库来实现生产者消费者场景。处理涉及一系列任务。数据流库非常适合我的用例。
但我想知道如何有效地实现此用例[详情如下]。
我想在服务器类型设置中使用TPL Dataflow。
通过服务器类型设置,我的意思是数据流的生成将永久地[异步]发生。消费任务也会永远运行,并消耗生产者[异步]产生的所有数据。 因此我的积木永远运行
如何有效地为此场景建模?此外,我怎么能处理异常处理,因为我不能Wait()
[没有调用Wait()
我无法捕捉到故障块上抛出的异常,就我的理解而言。
答案 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;。