Может ли статическая функция в статическом классе, которая использует yield return
для возврата IEnumerable, безопасно вызываться из нескольких потоков?Является ли доходность возврата реентерабером?
public static IEnumerable<FooClass> FooClassObjects()
{
foreach (FooClassWrapper obj in listOfFooClassWrappers)
{
yield return obj.fooClassInst;
}
}
Будет ли каждый поток, который вызывает это, всегда получать ссылку на каждый объект в коллекции? В моей ситуации listOfFooClassWrappers
записывается один раз в начале программы, поэтому мне не нужно беспокоиться об этом, меняя его во время вызова этой функции. Я написал простую программу для проверки этого, и я не видел никаких указаний на проблемы, но проблемы с потоками могут быть сложными, и возможно, что проблема просто не отображалась во время прогонов, которые я делал.
EDIT: Is yield return in C# thread-safe? аналогичен, но касается ситуации, когда коллекция изменяется при повторении. Моя забота больше связана с несколькими потоками, каждый из которых получает только часть коллекции из-за скрытого общего итератора, учитывая, что класс и метод являются статическими.
Да. http://stackoverflow.com/questions/1379266/is-yield-return-in-c-sharp-thread-safe, https://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes- of-the-c-yield-keyword /, http://stackoverflow.com/questions/4157771/thread-safety-of-yield-return-is-it Каждый поток, вызывающий 'FooClassObjects.GetEnumerator()' (такой как ' foreach (var foo in FooClassObjects) ') получит свой собственный счетчик, работающий над собственной копией конечного автомата, в который компилируется метод, содержащий' yield return'. – CodeCaster