I believe this works, I've tested it with multiple concurrent threads (though not exhaustively for race conditions and deadlocks):
public static System.Collections.Concurrent.ConcurrentDictionary<string, item> dict =
new System.Collections.Concurrent.ConcurrentDictionary<string, item>();
public static item dump;
...
foreach (System.Collections.Generic.KeyValuePair<string, item> x in dict)
{
lock (x.Value)
{
if (x.Value.IsCompleted)
{
dict.TryRemove(x.Key, out dump);
}
}
}
This question is sort of a continuation of this question:
Can I remove items from a ConcurrentDictionary from within an enumeration loop of that dictionary?
And this question:
Updating fields of values in a ConcurrentDictionary
In that I'm doing two "dicey" maneuvers:
- Removing values from a
ConcurrentDictionary
while at the same time enumerating through it (which seems to be ok). - Locking the
Value
portion of aConcurrentDictionary
. Necessary because manipulating fields of the value is not thread safe, only manipulating the values themselves of theConcurrentDictionary
is thread safe (the code above is a snippet of a larger code block in which fields of values are actually manipulated).