C# 收益率是可重入的吗?
静态类中使用C# 收益率是可重入的吗?,c#,multithreading,C#,Multithreading,静态类中使用产生返回来返回IEnumerable的静态函数能否从多个线程中安全调用 public static IEnumerable<FooClass> FooClassObjects() { foreach (FooClassWrapper obj in listOfFooClassWrappers) { yield return obj.fooClassInst; } } 公共静态IEnumerable FooClassObjects(
产生返回
来返回IEnumerable的静态函数能否从多个线程中安全调用
public static IEnumerable<FooClass> FooClassObjects()
{
foreach (FooClassWrapper obj in listOfFooClassWrappers)
{
yield return obj.fooClassInst;
}
}
公共静态IEnumerable FooClassObjects()
{
foreach(listOfFooClassWrappers中的FooClassWrapper对象)
{
收益率-收益率obj.fooClassInst;
}
}
调用此函数的每个线程是否总是收到对集合中每个对象的引用?在我的情况下,listOfFooClassWrappers
在程序开始时被写入一次,因此我不需要担心它在调用此函数时会发生变化。我编写了一个简单的程序来测试这一点,我没有看到任何问题的迹象,但是线程问题可能很难解决,而且有可能在我所做的运行期间没有出现问题
EDIT:类似,但解决了在迭代时修改集合的情况。我关心的更多的是多个线程,由于类和方法都是静态的,所以隐藏的共享迭代器使得每个线程只能获取集合的一部分
静态类中使用yield-return返回IEnumerable的静态函数能否从多个线程安全地调用
public static IEnumerable<FooClass> FooClassObjects()
{
foreach (FooClassWrapper obj in listOfFooClassWrappers)
{
yield return obj.fooClassInst;
}
}
使返回的方法/属性成为迭代器。具体化后,将调用它并在内部调用IEnumerable.GetEnumerator()
——这是线程安全的。这将返回一个实例
请查看以下说明:
此外,这一问题也以类似的方式提出。是,调用FooClassObjects.GetEnumerator()
(例如foreach(FooClassObjects中的var foo)
)的每个线程将获得自己的枚举器,处理包含的方法所编译成的状态机的副本。