我想找到一种让线程等待直到在集合中找到键之前的干净方法(确定会在某个时刻发生)
对于某些情况,我列出了需要验证的项目。字典中将包含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
}