ConcurrentDictionary.TryGet(): мне нужно использовать в то время как?
Я не уверен, что полностью понимаю TryGet
метод.
Когда это точно вернется false
- когда внутренний замок заблокирован, и это означает, что я должен использовать while
если я хочу получить ценность (зная, что это там)?
Или это while
как-то встроен в эту функцию и возвращает false
значит - такого ключа в словаре нет?
NB. Это право для всех других методов ConcurrentDictionary
- TryAdd
так далее?
2 ответа
TryGet
будет блокироваться, пока не будут удалены все блокировки. Обычно это очень короткий блок (для добавления или удаления ключа не требуется много времени). Затем он вернет true, если ключ / значение присутствует, и false в противном случае. Он не будет ждать добавления ключа.
Если вы ожидаете, что ключ будет заполнен другим потоком, и вы не уверены, что он закончен, вы можете использовать цикл while. Но мне никогда не приходилось это делать. Я думаю, что если вы обнаружите, что пишете цикл while в этих обстоятельствах, у вас может быть неоптимальный дизайн. Подумайте об использовании GetOrAdd для извлечения значения, которое позволяет вам предоставить функцию для заполнения ключа, если его нет, например
var user = dictionary.GetOrAdd("User", (key) => GetUser());
Если вы не хотите использовать GetOrAdd
и вам абсолютно необходимо дождаться завершения этого другого потока, попробуйте провести рефакторинг вашего кода, чтобы у вас была ссылка на его SynchronizationContext или его задачу. Тогда / подожди. Это даст выполнение более эффективным способом, чем цикл while.
Возвращает логическое значение true, если ключ был найден в ConcurrentDictionary; иначе ложно.