У меня сборка .NET 4.0; он зарегистрирован в GAC и работает как часть «оркестровки» BizTalk.
Иногда я получаю следующую ошибку: «Коллекция была изменена; операция перечисления может не выполняться. : System.InvalidOperationException: коллекция была изменена; операция перечисления может не выполняться. ». Я не могу воспроизвести это; когда я выполняю ту же обработку тех же данных, моя сборка не генерирует ошибку в этом месте.
Ошибка возникает, когда я вызываю W .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();
..................
Объект «instance» - это набор данных - мой класс, созданный из System.Data.DataSet.
Свойство instances.WorkContributors представляет собой объект данных: объект класса System.Data.TypedTableBase.
Класс MyDataRowClass создается из System.Data.DataRow.
Стек вызовов после ошибки был следующим:
Коллекция была изменена; операция перечисления может не выполняться. : 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 (источник IEnumerable 1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable
1)
в MyProduct.FileParser.Types.CWR.PWRType.GetPublishers (экземпляры CWRWorkInstances, Nullable`1 setTypeGroupId)
в MyProduct.FileParser.Validation.Concreate.PwrTypeValidation.ValidatePublisherNumber ()
в MyProduct.FileParser.Validation.Concreate.PwrTypeValidation.Validate ()
в MyProduct.FileParser.Types.CWR.PWRType.StoreRecord (CWRWorkInstances workInstances, контекст CWRWorkParsingContext)
в MyProduct.FileParser.Groups.CWR.NWRGroup.StoreGroup (Int32 workBatchID, CWRFileCommonData commonData)
в MyProduct.FileParser.CWRParser.ProcessCWRFile (строковое имя файла, логическое ожидание, логическое удаление файла, строковое имя источника)
Я не могу понять, почему происходит ошибка; и почему это происходит только иногда и больше не происходит с теми же обработанными данными.
Ошибка «Коллекция была изменена; операция перечисления может не выполняться ». Само по себе довольно просто; но я не понимаю, почему так происходит в моем коде. Ошибка исключается, если код, подобный этому:
foreach (DataRow currRow in _someDataTable.Rows)
{
if (/*deletion condition*/)
{
someDataTable.Rows.Remove(currRow);
}
}
Но мой код выше просто хочет перечислить System.Data.TypedTableBase и преобразовать результат в массив.
Есть идеи?