tagsDetectedInMoreThanTwoZones

tagsDetectedInMoreThanTwoZones

我在这里已经读过了,虽然通常认为迭代字典是在滥用数据结构并使用其他东西。

但是,我在想出一种更好的方法来完成我想做的事情时遇到了麻烦。

扫描标签时,我将其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集,并且每个集都可能被专用线程占用!

09-17 05:35