Есть одна ссылка, где она очень хорошо проработана и также дано решение.
Попробуйте, если вы нашли правильное решение, пожалуйста, напишите здесь, чтобы другие могли понять.
Данное решение в порядке, тогда как пост, чтобы другие могли попробовать это решение.
для вас ссылка на оригинальную ссылку: -
https://bensonxion.wordpress.com/2012/05/07/serializing-an-ienumerable-produces-collection-was-modified-enumeration-operation-may-not-execute/
Когда мы используем классы .Net Serialization для сериализации объекта, где его определение содержит тип Enumerable, т.е.
collection, вы легко получите InvalidOperationException, сообщив, что «Коллекция была изменена;
Операция перечисления может не выполняться ", если кодирование выполняется в многопоточных сценариях.
Основная причина в том, что классы сериализации будут перебирать коллекцию через перечислитель, как таковой,
проблема заключается в попытке перебрать коллекцию при ее изменении.
Первое решение, мы можем просто использовать блокировку в качестве решения для синхронизации, чтобы гарантировать, что
операция с объектом List может выполняться только из одного потока за раз.
Очевидно, вы получите штраф за производительность, что
если вы хотите сериализовать коллекцию этого объекта, то для каждого из них будет применена блокировка.
Ну, .Net 4.0, который делает работу с многопоточными сценариями удобной.
я обнаружил, что для этой проблемы с сериализацией в поле Collection можно воспользоваться классом ConcurrentQueue (Check MSDN),
который является потокобезопасным и FIFO-коллекцией и делает код без блокировки.
Используя этот класс, в его простоте то, что вам нужно изменить для своего кода, заменяет тип Collection на него,
используйте Enqueue, чтобы добавить элемент в конец ConcurrentQueue, удалите код блокировки.
Или, если сценарий, над которым вы работаете, требует таких сборщиков, как List, вам потребуется еще немного кода, чтобы адаптировать ConcurrentQueue к вашим полям.
Кстати, ConcurrentQueue не имеет метода Clear из-за базового алгоритма, который не допускает атомарной очистки коллекции.
так что вы должны сделать это сами, самый быстрый способ - это создать новое пустое ConcurrentQueue для замены.