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 
ConcurrentDictionarywhile at the same time enumerating through it (which seems to be ok). - Locking the 
Valueportion of aConcurrentDictionary. Necessary because manipulating fields of the value is not thread safe, only manipulating the values themselves of theConcurrentDictionaryis thread safe (the code above is a snippet of a larger code block in which fields of values are actually manipulated).