我在这里已经读过了,虽然通常认为迭代字典是在滥用数据结构并使用其他东西。
但是,我在想出一种更好的方法来完成我想做的事情时遇到了麻烦。
扫描标签时,我将其ID用作键,并且值是该标签在其中可见的区域的列表。大约每秒检查一次字典中的标签是否在两个或更多个区域中被看到,以及是否有,将其排队进行一些计算。
for (int i = 0; i < TagReads.Count; i++)
{
var tag = TagReads.ElementAt(i).Value;
if (tag.ZoneReads.Count > 1)
{
Report.Tags.Enqueue(tag);
Boolean success = false;
do
{
success = TagReads.TryRemove(tag.Epc, out TagInfo outTag);
} while (!success);
}
}
我觉得这里是一个字典是正确的选择,因为可以查找很多标签,但是有关此代码的某些信息使我感到很糟糕。
就效率而言。在我们的小规模测试环境中,目前的速度还不错,但是在投入使用之前,我还没有很好的方法来找到它在大规模上的工作方式,因此我很担心。
最佳答案
我相信,有另一种方法不涉及迭代大词典。
首先,您需要创建标签的HashSet<T>
,将在两个以上区域中检测到的标签存储在标签上。我们将其称为tagsDetectedInMoreThanTwoZones
。
您可以按以下方式重构代码流:
A.每当您在一个区域中检测到标签时...
将标签和区域添加到主词典中。
创建对tagsDetectedInMoreThanTwoZones
的排他锁,以避免B.中的不良行为。
检查密钥是否具有多个区域。如果是true
,请将其添加到tagsDetectedInMoreThanTwoZones
。
解除对tagsDetectedInMoreThanTwoZones
的锁定。
B.每当您需要处理在多个区域中检测到的标签时...
创建一个针对tagsDetectedInMoreThanTwoZones
的排他锁,以避免试图处理它们的线程更多。
迭代tagsDetectedInTwoOrMoreZones
。
使用tagsDetectedInMoreThanTwoZones
中的每个标签获取当前词典中的区域。
清除tagsDetectedInMoreThanTwoZones
。
释放对tagsDetectedInMoreThanTwoZones
的排他锁。
现在,您将迭代那些已经在多个区域中检测到的已知标签!
从长远来看,您甚至可以按区域划分分区,因此您永远不会获得带有太多项目要迭代的tagsDetectedInMoreThanTwoZones
集,并且每个集都可能被专用线程占用!