documentation класса DataRow окончательно утверждает, что
Этот тип является безопасным для многопоточных операций чтения. Вы должны синхронизировать любые операции записи.
Не может быть более конкретным, чем это.
В любом случае параллельная запись в Datatable, вероятно, не будет хорошо масштабироваться. Масштабируемость страдает, когда у вас есть несколько потоков, обращающихся к общему состоянию, и единый тип данных является вполне очевидным совместным состоянием. Более того, если вы не работаете с оборудованием NUMA, ваши ядра процессора будут бороться за доступ к одной и той же шине памяти.
Лучшим решением является возвращение любых результатов от параллельной обработки («прочее вещество») в отдельной структуре (например, one of the concurrent collections) и применение изменений от одного потока при завершении цикла.
Другой вариант - использовать PLINQ для вычисления результатов и итерации по ним с помощью простого foreach, чтобы применить изменения к DataTable.
Еще лучшим решением было бы полностью отказаться от исходных данных и вернуть новый объект, который содержит нужные вам поля. Если ваш код не требует, чтобы результат был DataTable, вы могли бы просто вернуть результаты в виде IEnumerable
'DataTable' - чрезвычайно сложный зверь. – SLaks
Позвольте мне угадать, когда развертывать приложение на нескольких процессорах. может быть глупым ответом. –
«Предположения делают задницу из' u' и 'mptions'? Psst .. высказывание о «предполагайте» не «предположения»;) – Jamiec