【发布时间】: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? 类似,但解决了在迭代时修改集合的情况。考虑到类和方法都是静态的,由于隐藏的共享迭代器,我的担忧更多地与多个线程有关,每个线程只能获取集合的一部分。
【问题讨论】:
-
是的。 stackoverflow.com/questions/1379266/…、startbigthinksmall.wordpress.com/2008/06/09/…、stackoverflow.com/questions/4157771/… 每个调用
FooClassObjects.GetEnumerator()(例如foreach (var foo in FooClassObjects))的线程都将获得自己的枚举器,在它自己的状态机副本上工作,包含yield return的方法被编译到其中。
标签: c# multithreading