2015-12-14 3 views
13

Может ли статическая функция в статическом классе, которая использует 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? аналогичен, но касается ситуации, когда коллекция изменяется при повторении. Моя забота больше связана с несколькими потоками, каждый из которых получает только часть коллекции из-за скрытого общего итератора, учитывая, что класс и метод являются статическими.

+9

Да. 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

ответ

4

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

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

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

Кроме того, это было предложено аналогичным образом here.

Смежные вопросы