Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 收益率是可重入的吗?_C#_Multithreading - Fatal编程技术网

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)
)的每个线程将获得自己的枚举器,处理包含
的方法所编译成的状态机的副本。