Credo che questo funziona, ho provato con più thread simultanei (anche se non in modo esaustivo per le condizioni di competizione e deadlock):C# .NET 4.0 ConcurrentDictionary: TryRemove all'interno di un blocco?
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);
}
}
}
Questa domanda è una sorta di continuazione di questa domanda:
Can I remove items from a ConcurrentDictionary from within an enumeration loop of that dictionary?
E questa domanda:
Updating fields of values in a ConcurrentDictionary
In che sto facendo due manovre "rischiose":
- valori Rimozione da un
ConcurrentDictionary
, mentre allo stesso tempo l'enumerazione attraverso di essa (che sembra essere ok). - Blocco della parte
Value
di unConcurrentDictionary
. Necessario perché la manipolazione dei campi del valore non è thread-safe, solo la manipolazione dei valori stessi diConcurrentDictionary
è thread-safe (il codice sopra è uno snippet di un blocco di codice più grande in cui i campi di valori sono effettivamente manipolati).
grazie Jon sì: discarica è destinata ad essere un ripostiglio inutile.lo trasformerò in una variabile locale, come ambito globale la static statica è una vulnerabilità le proprietà all'interno dell'elemento: bloccherò le singole proprietà piuttosto che l'articolo, come suggerito. potrebbe esserci un modo più elegante per gestire questo, ma queste proprietà verranno modificate in un thread, lette in un altro e rimosse a livello di articolo in un terzo applausi! – circletimessquare