Интересно, являются ли методы расширения Linq атомарными? Или мне нужно lock любой объект IEnumerable, используемый для потоков, перед любой итерацией?
Влияет ли объявление переменной volatile на это?
Подводя итог, какое из следующего является лучшим, потокобезопасным, операция?
1- Без каких-либо блокировок:
IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
2- Включение операторов блокировки:
IEnumerable<T> _objs = //...
lock(_objs)
{
var foo = _objs.FirstOrDefault(t => // some condition
}
3 Объявление переменной как изменчивой:
volatile IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition