collections被修改; 枚举操作可能无法在Except操作上执行

我试图从循环中的DataTable dt中删除一些行,我得到上述exception:

 while (dt.Rows.Count > 0 && retry < Globals.PushRetryLimit) { var query = dt.AsEnumerable().Except(successBatch.AsEnumerable(), DataRowComparer.Default) .AsEnumerable().Except(failBatch.AsEnumerable(), DataRowComparer.Default); if (dt.AsEnumerable().Any()) dt = query.CopyToDataTable(); } 

successBatchfailBatch都是dt DataTable克隆。

在提出此错误的其他问题中,我们正在处理foreach循环。 为什么会出现此错误?

堆栈跟踪:

  at System.Data.DataTableExtensions.LoadTableFromEnumerable[T](IEnumerable`1 source, DataTable table, Nullable`1 options, FillErrorEventHandler errorHandler) at System.Data.DataTableExtensions.CopyToDataTable[T](IEnumerable`1 source) 

您正在使用foreach循环遍历集合中的元素(您的dataTable)。

Foreach查询枚举器并询问下一个元素。 如果删除项目,则枚举器的状态将变为无效。 枚举器必须存储一些日期,指示其当前位置。

你不应该这样做。 也许使用另一个集合来跟踪更改或使用并发集合 (阅读链接中的类)