我有一个 .NET 4.0 程序集;它在 GAC 中注册并作为 BizTalk“编排”的一部分工作。有时我会收到以下错误 - “收藏已修改;枚举操作可能不会执行。:System.InvalidOperationException:集合已修改;枚举操作可能无法执行。”。我无法复制它;当我对相同的数据运行相同的处理时,我的程序集不会在这个地方产生错误。
当我为数据表对象调用“.Where().ToArray()”时会发生错误:类 System.Data.TypedTableBase 的对象。
这是代码: .....
int? setTypeGroupId;
...
return instances.WorkContributors.Where
(
c =>
!c.IsInterestedPartyNoNull()
&& c.InterestedPartyNo == publisherIpNo
&& c.SetTypeNo == 1
&& (c.RecordType == "SPU")
&& c.TypeCode == "E"
&& (!setTypeGroupId.HasValue ||
(setTypeGroupId.HasValue && c.SetTypeGroupID == setTypeGroupId))
).ToArray();
..................
对象“实例”是一个数据集——我的类是从 System.Data.DataSet 生成的。属性“instances.WorkContributors”是一个数据表:System.Data.TypedTableBase 类的对象。MyDataRowClass 类是从 System.Data.DataRow 生成的。
错误后的调用堆栈如下: Collection was modified; 枚举操作可能不会执行。:System.InvalidOperationException:集合已修改;枚举操作可能不会执行。在 System.Data.RBTree 1.RBTreeEnumerator.MoveNext()
at System.Linq.Enumerable.<CastIterator>d__97
1.MoveNext() 在 System.Linq.Enumerable.WhereEnumerableIterator 1.MoveNext()
at System.Linq.Buffer
1..ctor(IEnumerable1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable
1 来源)在 MyProduct.FileParser.Validation.Concreate.PwrTypeValidation.ValidatePublisherNumber() 在 MyProduct.FileParser.Validation.Concreate.PwrTypeValidation.Validate () 在 MyProduct.FileParser.Groups.CWR.NWRGroup.StoreGroup(Int32 workBatchID, CWRFileCommonData commonData) 在 MyProduct.FileParser.CWRParser.ProcessCWRFile(String文件名,布尔等待,布尔删除文件,字符串源文件名)
我不明白为什么会发生错误;以及为什么它只偶尔发生并且不会再次发生在相同的处理数据上。错误“收藏已修改;枚举操作可能无法执行。” 对我来说,这本身就很简单;但我不明白为什么它会发生在我的代码中。如果像这样的代码,则该错误除外:
foreach (DataRow currRow in _someDataTable.Rows)
{
if (/*deletion condition*/)
{
someDataTable.Rows.Remove(currRow);
}
}
但是我上面的代码只是想枚举 System.Data.TypedTableBase 并将结果转换为数组。
有任何想法吗?