Подтвердить что ты не робот

Является ли доходность возвратной?

Может ли статическая функция в статическом классе, которая использует yield return для возврата IEnumerable, быть безопасно вызвана из нескольких потоков?

public static IEnumerable<FooClass> FooClassObjects()
{
    foreach (FooClassWrapper obj in listOfFooClassWrappers)
    {
        yield return obj.fooClassInst;
    }
}

Будет ли каждый поток, который вызывает это, всегда получать ссылку на каждый объект в коллекции? В моей ситуации listOfFooClassWrappers записывается один раз в начале программы, поэтому мне не нужно беспокоиться об этом, изменяя его во время вызова этой функции. Я написал простую программу, чтобы проверить это, и я не видел никаких признаков проблем, но проблемы с потоками могут быть сложными, и возможно, что проблема просто не отображалась во время прогонов, которые я сделал.

EDIT: Является ли доходность возврата в С# потокобезопасной? аналогичной, но решает ситуацию, когда коллекция изменяется при повторении. Моя забота больше связана с несколькими потоками, каждый из которых получает только часть коллекции из-за скрытого общего итератора, учитывая, что класс и метод являются статическими.

4b9b3361

Ответ 1

Может ли статическая функция в статическом классе, использующая yield return для возврата IEnumerable, быть безопасно вызвана из нескольких потоков?

yield keyword делает метод t21 > return/Итератором. Когда материализуется, он вызывается и внутренне IEnumerable.GetEnumerator() вызывается - который является потокобезопасным. Это возвращает один экземпляр.

Ознакомьтесь с этим объяснением: https://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/

Кроме того, это было задано аналогичным образом здесь.