Я хотел бы найти чистый способ для потока ждать, пока ключ не будет найден в коллекции (точно зная, что это произойдет в какой-то момент)
Для некоторого контекста у меня есть список элементов, которые необходимо проверить. Словарь будет содержать идентификатор элемента в качестве ключа и значение 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
}