Mi chiedo se i metodi di estensione Linq siano atomici? O ho bisogno di lock
qualsiasi oggetto IEnumerable
utilizzato nei thread, prima di qualsiasi tipo di iterazione?I metodi IEnumerable Linq sono thread-safe?
La dichiarazione della variabile volatile
ha qualche effetto su questo?
Per riassumere, quale delle seguenti è la migliore, thread-safe, operazione?
1- Senza alcun blocco:
IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
2- Compresi istruzioni lock:
IEnumerable<T> _objs = //...
lock(_objs)
{
var foo = _objs.FirstOrDefault(t => // some condition
}
3- Dichiarazione variabile come volatile:
volatile IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
Non sono thread-safe. Vedi http://stackoverflow.com/questions/9995266/how-to-create-a-thread-safe-generic-list – stuartd