yield return是否可重入?

14

一个使用yield return返回一个IEnumerable的静态类中的静态函数是否可以安全地从多个线程调用?

public static IEnumerable<FooClass> FooClassObjects()
{
    foreach (FooClassWrapper obj in listOfFooClassWrappers)
    {
        yield return obj.fooClassInst;
    }
}
每个调用此函数的线程是否都会收到集合中每个对象的引用?在我的情况下,listOfFooClassWrappers在程序开始时只写入一次,因此我不需要担心在调用此函数期间它会更改。我编写了一个简单的程序来测试这一点,我没有看到任何问题迹象,但线程问题可能很难找出,而且可能是因为我运行的过程中没有显示该问题。编辑:C#中的yield return是否线程安全?类似,但涉及到在迭代过程中修改集合的情况。我的关注点更多地涉及到多个线程由于隐藏的共享迭代器而只获取集合的部分内容,因为类和方法都是静态的。

9
是的。每个调用FooClassObjects.GetEnumerator()的线程(例如foreach (var foo in FooClassObjects))都会获得自己的枚举器,这个枚举器在自己所在的状态机副本上工作,而该状态机是包含yield return的方法所编译出来的。参考链接:https://dev59.com/UXM_5IYBdhLWcg3wcCrc, 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 - CodeCaster
1个回答

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接