Интересно, являются ли методы расширения Linq атомарными? Или мне нужно заблокировать
любой объект 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:
volatile IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition