如何等待密钥添加到集合中

时间:2019-04-17 15:23:07

标签: c# .net multithreading thread-safety

我想找到一种让线程等待直到在集合中找到键之前的干净方法(确定会在某个时刻发生)

对于某些情况,我列出了需要验证的项目。字典中将包含Id作为键,并将bool作为值。 这些项目不在统一清单中。项被链接为上一个项之后的下一个(很多)。一个项目可以在多个项目之后和/或之前。也可能有多个起点。虽然没有循环。

只有同时验证了所有先前的项目,该项目才会被验证。 由于项目之间存在多对多关系,因此很有可能两次检查项目。这就是为什么我创建一个仅包含所有已验证或正在验证的项目(以后称为“可见项目”)的新列表的原因。

示例:

   Item1 -- > Item3 --> Item4 -- > Item6
          /                    /
   Item2 /  ----------> Item5 /

我从第6项开始,将其添加到可见的项中,然后并行检查所有先前的项(4,5)。然后,Item5将检查item2。然后,Item4将检查3、2和1。Item2现在将被检查两次。 为了解决这个问题,线程将首先检查是否已在可见的项目中包含item2,如果已存在,则从结果字典中获取值,而不是再次进行检查。

问题:

当需要检查item2的线程在看到的项目中找到item2时,它尚不知道该值。该值可能尚未计算,因为另一个线程仍在忙中检查它。 我将如何命令该线程等待将该项目添加到结果字典中,一旦添加,获取其值,然后正常进行? (我肯定会在某个时候添加它)

(接下来不是100%理解多线程的废话)
如果被阻塞的线程可以在其他地方用于检查尚未检查的项目,那当然是很好的。

代码:

// Item not yet checked
if (alreadySeenActions.TryAdd(item.Id, item.Id))
{
   // Check the childs 
   var childsAreValid = CheckChilds(item);
   result.Add(item.Id, childsAreValid);

   // Do some more 
// Item already checked/being checked
} else {
    // item.Id might not be in the result yet, but it will always be (otherwise it will never end up in the alreadySeenActions in the first place and not enter this else)
    // So what do I write here?
    var value = result[item.Id]

    if(value)
    // Do some more
}

0 个答案:

没有答案