Ввод блокировки в блоке итератора

Мне любопытно узнать, является ли блок итератора хорошим местом для блокировки.

У меня есть этот метод:

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))
{
    ...
}

Будет ли спинлок заблокирован при доступе к элементам? Или блокировка выйдет и снова войдет в каждую итерацию?

0 ответов

Другие вопросы по тегам