Будет ли он возвращать false только в том случае, если словарь не содержит значения для данного ключа, или он также возвращает false из-за условий состязания потоков, как другой поток добавляет / обновляет что-то?
Вопрос в коде :
ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>();
// This might fail if another thread is adding with key value of 1.
cd.TryAdd(1, "one");
// Will this ever fail if no other thread ever removes with the key value of 1?
cd.TryRemove(1);
Edit: Я думаю, что он вернет false только в том случае, если он не содержит значения для данного ключа, но хочет быть абсолютно уверенным.
Хотя Митч прав в том, что ConcurrentDictionary
не уязвим к условиям гонки, я думаю, что ответ на вопрос, который вы задаете, - да, если ключ присутствует, TryRemove
будет работать и вернет true
.
В опубликованном вами коде нет способа, чтобы TryRemove
возвратил false
, поскольку cd
- это локальная переменная, к которой больше нигде нет доступа. Но если в каком-то другом коде была указана ссылка на этот объект ConcurrentDictionary
и он удалял ключи в отдельном потоке, то вполне возможно, что TryRemove
может вернуть false
, даже если здесь - но только потому, что ключ уже был удален , а не потому, что со словарем выполняется какое-то другое действие, и ключ каким-то образом "застрял" там.
Словарь ConcurrentDictionary не страдает от условий гонки. Вот почему вы используете его.
Возвращаемое значение
true, если объект был удален успешно; в противном случае - false.