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; иначе ложно.

Другие вопросы по тегам