Mr.*_*urg 13 c# multithreading
可以yield return从多个线程调用静态类中的静态函数来安全地返回IEnumerable吗?
public static IEnumerable<FooClass> FooClassObjects()
{
foreach (FooClassWrapper obj in listOfFooClassWrappers)
{
yield return obj.fooClassInst;
}
}
Run Code Online (Sandbox Code Playgroud)
调用它的每个线程是否总是会收到对集合中每个对象的引用?在我的情况下listOfFooClassWrappers,在程序开始时写入一次,所以我不需要担心在调用此函数期间它会发生变化.我写了一个简单的程序来测试这个,我没有看到任何问题的迹象,但是线程问题可能很难被解决,并且这个问题可能在我做的运行期间根本没有显示出来.
编辑:C#线程安全的收益率回报?是类似的,但解决了迭代过程中修改集合的情况.由于隐藏的共享迭代器,因为类和方法都是静态的,所以我的关注更多地涉及多个线程,每个线程只获得集合的一部分.
可以从多个线程安全地调用静态类中使用yield return 返回 IEnumerable 的静态函数吗?
关键字使返回的yield方法IEnumerable<T>/属性成为迭代器。当具体化时,它被调用并在内部IEnumerable.GetEnumerator()被调用——这是线程安全的。这将返回单个实例。
查看此解释:https://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/
此外,这里也以类似的方式提出了这个问题。