Не удалось обновить PLINQ - PullRequest
       11

Не удалось обновить PLINQ

2 голосов
/ 19 августа 2010

извините за мой английский. Вот мой вопрос Я пытаюсь обновить DataTable от PLINQ Вот мой код

DataTable table = new DataTable();

table.Columns.Add(new DataColumn("val", typeof(decimal)));

int N = 1000000;

for (int i = 0; i < N; i++) table.Rows.Add(new object[] { i });

table.AsEnumerable().AsParallel().ForAll(row => row["val"] = 3);

Но есть исключение: «Индекс вышел за пределы допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс "

Пожалуйста, помогите мне

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Ну, я могу вам сказать прямо сейчас, что параллельное изменение строк DataTable не является кошерным (из документации MSDN по классу DataTable):

Этот тип безопасен для многопоточных операции чтения. Вы должны синхронизировать любые операции записи.

Так что, хотя я не уверен точно, что вызывает конкретное исключение, о котором вы упомянули, я знаю, что вы действительно не должны пытаться делать это, поскольку оно не поддерживается.

0 голосов
/ 19 августа 2010

Найденное решение:

table.AsEnumerable (). AsParallel (). ForAll (row => {lock (table) row ["val"] = 3;});

Но после этого - параллель не имеет смысла

...