Интересно, являются ли методы расширения 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