Mentre la risposta a this question è eccellente, implica che è necessario circondare le chiamate a List.ToArray() in un blocco per la concorrenza. this blog post implica anche che potrebbe fallire in modo catastrofico (ma raramente). Generalmente utilizzo ToArray piuttosto che un lock in quando si enumerano elenchi o altre raccolte per evitare l'eccezione "Collection Modified, Enumeration may not complete". Questa risposta e il post sul blog hanno messo in discussione questa ipotesi.Can ToArray() può generare un'eccezione?
La documentazione per List.ToArray() non elenca eccezioni, quindi ho sempre presupposto che verrà sempre completata (anche se forse con dati obsoleti) e che mentre non è thread-safe dal punto di vista della consistenza dei dati , è thread-safe dal punto di vista dell'esecuzione del codice: in altre parole, non genera un'eccezione e chiamarla non corrompe la struttura interna dei dati della raccolta sottostante.
Se questa ipotesi non è corretta, anche se non ha mai causato un problema, potrebbe essere una bomba a tempo in un'applicazione ad alta disponibilità. Qual è la risposta definitiva?
Elenco .Add inoltre non genera un'eccezione se altri thread modifica l'elenco contemporaneamente. Non è ancora sicuro per i thread. Controlla solo che non stai modificando e enumerandolo contemporaneamente nella stessa discussione. Cosa ti fa pensare che un metodo che non è documentato per essere thread-safe potrebbe essere thread-safe? (Supponendo che si sta parlando di Lista .ToArray o Enumerable.ToArray. ConcurrentBag .ToArray è thread-safe, come enumerare un ConcurrentBag senza ToArray.) –
dtb
ho ristretto la portata della questione di concentrarsi sulla lista e lista poiché questi sono quelli di cui sono più preoccupato. Ho visto questa tecnica utilizzata in un certo numero di framework open source popolari, quindi non credo di essere l'unico a fare ipotesi sulla "sicurezza" della tecnica. Non sto chiedendo se sono thread-safe (per definizione non lo sono), ma dovrei lanciare nel trovare e correggere istanze di chiamate "non sicure" a ToArray()? –
Sei sicuro che questi framework open source utilizzino ToArray piuttosto che un blocco o utilizzino ToArray per modificare un elenco mentre lo enumerano nello stesso thread? – dtb