使用自定义 IEnumerator,C# 的 yield return 线程安全吗?
Is C#'s yield return thread safe with a Custom IEnumerator?
我有一个简单的自定义 IEnumerator class 概念,它提供 struct/value 类型的枚举。 (整数、日期时间、枚举等)
class MyNumer : IEnumerator<int>
{
public MyNumer(int start, int end) { _start = start; _end = end; }
int _start;
int _end;
//Please just assume i've implemented the rest of IEnumerator, this is the only element that is
//pertinent to the question
public bool MoveNext()
{
if (this.Current == 0) this.Current = _start;
else if (this.Current <= _end) this.Current++;
return this.Current <= _end;
}
}
class ThreadedClass
{
public IEnumerable<int> GetNumbers(int start, int end) //this method can be called from multiple threads
{
IEnumerator<int> numer = new MyNumer(start, end);
while (numer.MoveNext()) yield return numer.Current;
}
}
我关心的是这个例子,if :
- 线程 1 调用“myThreadedClass.GetNumbers(1, 10)”
- 线程 2 调用“myThreadedClass.GetNumbers(30, 40)”
- Thread3 调用“myThreadedClass.GetNumbers(70, 100)”
我会得到三个独立的、不同的 IEnumerable returned,还是线程会在“yield return”上发生冲突?
您不仅会得到三个不同的 IEnumerable<int>
对象,而且每次您枚举它们中的每一个时,都会创建一个新的 IEnumerator<int>
,它有自己不同的 [=12] 内部实例=] class。因此,即使所有三个线程共享同一个 IEnumerable<int>
实例,也不会有线程安全问题,该实例由 GetNumbers
方法的单次调用返回。
我有一个简单的自定义 IEnumerator class 概念,它提供 struct/value 类型的枚举。 (整数、日期时间、枚举等)
class MyNumer : IEnumerator<int>
{
public MyNumer(int start, int end) { _start = start; _end = end; }
int _start;
int _end;
//Please just assume i've implemented the rest of IEnumerator, this is the only element that is
//pertinent to the question
public bool MoveNext()
{
if (this.Current == 0) this.Current = _start;
else if (this.Current <= _end) this.Current++;
return this.Current <= _end;
}
}
class ThreadedClass
{
public IEnumerable<int> GetNumbers(int start, int end) //this method can be called from multiple threads
{
IEnumerator<int> numer = new MyNumer(start, end);
while (numer.MoveNext()) yield return numer.Current;
}
}
我关心的是这个例子,if :
- 线程 1 调用“myThreadedClass.GetNumbers(1, 10)”
- 线程 2 调用“myThreadedClass.GetNumbers(30, 40)”
- Thread3 调用“myThreadedClass.GetNumbers(70, 100)”
我会得到三个独立的、不同的 IEnumerable returned,还是线程会在“yield return”上发生冲突?
您不仅会得到三个不同的 IEnumerable<int>
对象,而且每次您枚举它们中的每一个时,都会创建一个新的 IEnumerator<int>
,它有自己不同的 [=12] 内部实例=] class。因此,即使所有三个线程共享同一个 IEnumerable<int>
实例,也不会有线程安全问题,该实例由 GetNumbers
方法的单次调用返回。