收益率是否可以折返?

时间:2015-12-14 15:36:56

标签: c# multithreading

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

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

调用它的每个线程是否总是会收到对集合中每个对象的引用?在我的情况下listOfFooClassWrappers在程序开始时被写入一次,因此在调用此函数期间我不需要担心它会发生变化。我写了一个简单的程序来测试这个,我没有看到任何问题的迹象,但是线程问题可能很难被解决,而且这个问题可能在我做的运行期间没有出现。

编辑:Is yield return in C# thread-safe?类似,但解决了在迭代过程中修改集合的情况。由于隐藏的共享迭代器,因为类和方法都是静态的,所以我的担心更多地涉及多个线程,每个线程只获得集合的一部分。

1 个答案:

答案 0 :(得分:4)

  

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

yield keyword使IEnumerable<T>返回的方法/属性成为迭代器。具体化后,调用它并调用内部IEnumerable.GetEnumerator() - 这是线程安全的。这将返回单个实例。

请查看以下说明:https://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/

此外,我们也以类似的方式询问here