贪心JoinBlock解释

问题描述 投票:2回答:1

在默认的贪婪模式下,即使另一个目标没有形成元组的必要数据,也会接受提供给目标的所有数据。

根据这一点,我的理解是我可以使用下一个片段。

var block = new JoinBlock<int,int>(new GroupingDataflowBlockOptions(){Greedy = true});
block.Target1.Post(1);
//block.Target2.Post(2);
var tuple = block.Receive();

有人可以向我解释为什么我需要向两个目标发布数据吗?

c# tpl-dataflow
1个回答
0
投票

该块将接受数据到一个目标,但它不会传播数据,直到它可以形成一个Tuple。换句话说,你可以尽可能多地填充target1,但如果在target2没有任何东西,你将永远不会得到任何东西。

如果已跨多个连接块分配负载,则贪婪行为可能会成为问题。一个块会吸收所有输入数据,而不会让其他人有机会。

使用非贪婪连接也可以帮助您防止应用程序中出现死锁。在软件应用程序中,当两个或多个进程各自拥有一个资源并相互等待另一个进程释放某些其他资源时,就会发生死锁。考虑一个定义两个JoinBlock对象的应用程序。两个对象均从两个共享源块中读取数据。在贪婪模式下,如果一个连接块从第一个源读取而第二个连接块从第二个源读取,则应用程序可能会死锁,因为两个连接块相互等待另一个释放其资源。在非贪婪模式下,每个连接块仅在所有数据都可用时才从其源读取,因此消除了死锁的风险。

Source: How to: Use JoinBlock to Read Data From Multiple Sources

© www.soinside.com 2019 - 2024. All rights reserved.