min*_*ler 0 c# iterator yield enumerable enumerator
我正在使用 yield return 来处理一些数据,其中包含一组不确定的迭代。我想开始处理,但是一旦满足条件(例如字节大小)就从循环中断,将枚举数传递给将继续处理的新线程,然后返回到目前为止处理的结果。
实际上,我有一个 foreach 循环,我可能会在结束之前突破它。如何将 IEnumerable 传递给一个新线程并从我离开的地方而不是从头开始“继续”?
public static IEnumerable<String> Process()
{
// static values added for simplicity, but will be a variable number of returns
yield return "1";
yield return "2";
yield return "3";
yield return "4";
yield return "5";
yield return "6";
}
List<String> main()
{
List<String> retVal = new List<String>();
IEnumerable<String> strList = Process();
foreach(String strItem in strList)
{
retVal.Add(strItem);
Console.WriteLine(strItem);
// Time to send something back and continue in a new thread
if (strItem.Equals("3"))
{
break;
}
}
new Thread(() => ThreadFunc(strList)).Start();
return retVal;
}
public static void ThreadFunc(IEnumerable<String> strList)
{
List<String> retVal = new List<String>();
foreach(String strItem in strList)
{
retVal.Add(strItem);
Console.WriteLine(strItem);
}
// Send the rest of the data
}
Run Code Online (Sandbox Code Playgroud)
期望输出:1 2 3 4 5 6
实际输出:1 2 3 1 2 3 4 5 6
谢谢你。
看看IEnumerable<T>界面实际做了什么。
IEnumerable<T>完全无国籍;它只是公开了一个GetEnumerator()方法,该方法返回有状态的枚举器,用于跟踪它们的位置。
您需要在两个循环之间传递相同的枚举器实例。 foreach只能对IEnumerable<T>(或类似的)进行操作,因此您需要将它们替换为直接使用的while循环IEnumerator<T>。
确保处置IEnumerator所有codepaths(否则,finally或using块将无法运行)。
| 归档时间: |
|
| 查看次数: |
1067 次 |
| 最近记录: |