When will ConcurrentDictionary TryRemove return false
Solution 1:
While Mitch is right that a ConcurrentDictionary
is not vulnerable to race conditions, I think the answer to the question you are asking is that yes, if the key is present, TryRemove
will work and will return true
.
In the code you posted, there's no way that TryRemove
would return false
since cd
is a local variable not accessed anywhere else. But if some code elsewhere were given a reference to this ConcurrentDictionary
object and were removing keys on a separate thread, then it's possible that TryRemove
could return false
, even here -- but only because the key was already removed, not because some other action is being performed on the dictionary and the key is somehow "stuck" there.
Solution 2:
The ConcurrentDictionary does not suffer from race conditions. That's why you use it.
Return Value
true if an object was removed successfully; otherwise, false.
Solution 3:
One other point to make:
// This might fail if another thread is adding with key value of 1. cd.TryAdd(1, "one");
This comment is incorrect and possibly suffers from the same misconception about what it means to 'try'. It's not about a concurrent attempt to add, it's whether a value has already been added with key 1
.
Consider a standard Dictionary<TKey,TValue>
. The equivalent code would be:
if (!d.Contains(1))
d.Add(1, "one");
This requires two operations. There's no way to design such an API to be threadsafe, as cd
might have a value with key 1
added between the call to Contains
and Add
, which would then result in Add
throwing.
The concurrent collections have APIs that logically bundle these test-and-do pairs into single atomic operations, behind a single API.