【问题标题】:Is yield return reentrant?收益回报是可重入的吗?
【发布时间】:2016-03-20 03:54:34
【问题描述】:

可以从多个线程安全地调用使用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? 类似,但解决了在迭代时修改集合的情况。考虑到类和方法都是静态的,由于隐藏的共享迭代器,我的担忧更多地与多个线程有关,每个线程只能获取集合的一部分。

【问题讨论】:

标签: c# multithreading


【解决方案1】:

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

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

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

此外,这个问题已经以类似的方式被问到here

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2011-05-27
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2018-01-23
    • 2010-12-01
    相关资源
    最近更新 更多