Herman<T>.Instance Ответов: 1

Параллелизм на a ADO.NET звоните


У меня есть проект, в котором хранимая процедура вызывается на SQL Server 2014.
Я заполняю DataTable объект с результатом хранимой процедуры.
Это вызов выполняется в базовом классе и после заполнения он запускает Parallel.ForEach() на DataTable. В том virtual процессов (каждый объект переопределяет метод базового заполнить все классы сущностей) данные вам установить объекты в List<Entity>. Когда Parallel.ForEach() завершается я вызываю виртуальный метод который сущность также переопределяет это отмечает конец загрузки данных и LIST<> устанавливается в кэш. Однако иногда я вижу, что некоторые из сущностей в List<> являются NULL- Как это возможно? Чего мне не хватает, чтобы все строки были установлены в соответствующие значения?

Что я уже пробовал:

Я пробовал параллель.ForEach с опциями и без них. Один из вариантов устанавливает одновременную загрузку максимум 1 записи (фактически обработка на основе строк).
Когда я использую обычный foreach, я не вижу такого поведения.

1 Ответов

Рейтинг:
4

OriginalGriff

Если вы посмотрите на список<T & gt; документации - List< t & gt; Class, MSDN[^]
Вы найдете это внизу:

Цитата:
Безопасно выполнять несколько операций чтения над списком< t>, но могут возникнуть проблемы, если коллекция будет изменена во время чтения. Чтобы обеспечить потокобезопасность, заблокируйте коллекцию во время операции чтения или записи. Чтобы обеспечить доступ к коллекции для чтения и записи несколькими потоками, необходимо реализовать собственную синхронизацию. Сведения о коллекциях со встроенной синхронизацией см. В разделе классы в системе.Коллекции.Параллельное пространство имен. Для получения по своей сути потокобезопасной альтернативы см. Класс ImmutableList< t>.

Если вы не реализуете блокировку внутри параллели.Например, вы получите непредсказуемое поведение.


Herman&lt;T&gt;.Instance

Спасибо за наводку, Грифф! Что-нибудь почитать и потренироваться!

OriginalGriff

Пожалуйста!