Является ли доходность возвратной?
Может ли статическая функция в статическом классе, которая использует yield return
для возврата IEnumerable, быть безопасно вызвана из нескольких потоков?
public static IEnumerable<FooClass> FooClassObjects()
{
foreach (FooClassWrapper obj in listOfFooClassWrappers)
{
yield return obj.fooClassInst;
}
}
Будет ли каждый поток, который вызывает это, всегда получать ссылку на каждый объект в коллекции? В моей ситуации listOfFooClassWrappers
записывается один раз в начале программы, поэтому мне не нужно беспокоиться об этом, изменяя его во время вызова этой функции. Я написал простую программу, чтобы проверить это, и я не видел никаких признаков проблем, но проблемы с потоками могут быть сложными, и возможно, что проблема просто не отображалась во время прогонов, которые я сделал.
EDIT: Является ли доходность возврата в С# потокобезопасной? аналогичной, но решает ситуацию, когда коллекция изменяется при повторении. Моя забота больше связана с несколькими потоками, каждый из которых получает только часть коллекции из-за скрытого общего итератора, учитывая, что класс и метод являются статическими.
Ответы
Ответ 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/
Кроме того, это было задано аналогичным образом здесь.