Как ждать добавления ключа в коллекцию - PullRequest
1 голос
/ 17 апреля 2019

Я хотел бы найти чистый способ для потока ждать, пока ключ не будет найден в коллекции (точно зная, что это произойдет в какой-то момент)

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