Ввод блокировки в блоке итератора
Мне любопытно узнать, является ли блок итератора хорошим местом для блокировки.
У меня есть этот метод:
protected SpinLock readLock;
protected bool readLockTaken;
protected SpinLock writeLock;
protected bool writeLockTaken;
public IEnumerator<T> GetConsumingEnumerator()
{
readLock.Enter(ref writeLockTaken);
try
{
for (int i = 0; i < queue.Count; i++)
{
if(queue.Count != 0)
yield return queue.Dequeue();
else
yield break;
}
}
finally
{
readLock.Exit();
}
}
У меня нет большого опыта работы с блоками итераторов, и мне интересно, останется ли блокировка "введенной" в течение, скажем, такого утверждения:
foreach(T thing in ThingCollection.GetConsumingEnumerator())
{
...
}
Кроме того, если я использую LINQ, чтобы получить n элементов, где n < "collection".Count
следующее:
foreach(T thing in ThingCollection.GetConsumingEnumerator().Take(n))
{
...
}
Будет ли спинлок заблокирован при доступе к элементам? Или блокировка выйдет и снова войдет в каждую итерацию?