静态类中的静态函数是否可以安全地从多个线程中调用使用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?类似,但解决了在迭代过程中修改集合的情况。由于隐藏的共享迭代器,因为类和方法都是静态的,所以我的担心更多地涉及多个线程,每个线程只获得集合的一部分。
答案 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。