使用自定义 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. 线程 1 调用“myThreadedClass.GetNumbers(1, 10)”
  2. 线程 2 调用“myThreadedClass.GetNumbers(30, 40)”
  3. Thread3 调用“myThreadedClass.GetNumbers(70, 100)”

我会得到三个独立的、不同的 IEnumerable returned,还是线程会在“yield return”上发生冲突?

您不仅会得到三个不同的 IEnumerable<int> 对象,而且每次您枚举它们中的每一个时,都会创建一个新的 IEnumerator<int>,它有自己不同的 [=12] 内部实例=] class。因此,即使所有三个线程共享同一个 IEnumerable<int> 实例,也不会有线程安全问题,该实例由 GetNumbers 方法的单次调用返回。