收益率返回是可重入的

本文关键字:返回 收益率 | 更新日期: 2023-09-27 18:26:40

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

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

每个调用它的线程都会收到对集合中每个对象的引用吗?在我的情况下,listOfFooClassWrappers在程序开始时被写入一次,所以我不需要担心它在调用该函数时会发生变化。我写了一个简单的程序来测试这一点,我没有看到任何问题的迹象,但线程问题可能很难弄清楚,而且在我运行的过程中,这个问题可能根本没有出现。

编辑:C#线程中的yield return是安全的吗?类似,但解决了在迭代时修改集合的情况。我更关心的是,由于类和方法都是静态的,由于隐藏的共享迭代器,多个线程每个线程只能获得集合的一部分。

收益率返回是可重入的

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

yield关键字使返回方法/属性的IEnumerable<T>成为迭代器。当具体化时,它被调用,并在内部调用IEnumerable.GetEnumerator()——这是线程安全的。这将返回一个实例。

查看此解释:https://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/

此外,这里也以类似的方式提出了这个问题。