Нет, NewRow
не является операцией чтения и не является поточно-ориентированной.
Вместо использования NewRow
и заполнения строки вы можете просто поместить свои значения в массив или список object
. Затем, когда вы собрали все свои данные, вы можете добавить их в DataTable
.
var newRow = table.NewRow();
newRow.ItemArray = values; // array of values
table.Rows.Add(newRow);
Таким образом, вы можете распараллеливать создание ваших данных, не сталкиваясь с проблемами при добавлении их в DataTable
.
Глядя на исходный код для DataTable
:
Содержит различные поля:
private readonly DataRowBuilder rowBuilder;
internal readonly RecordManager recordManager;
NewRow()
вызывает NewRow(-1)
, а NewRow(int)
изменяет состояние этих полей:
internal DataRow NewRow(int record) {
if (-1 == record) {
record = NewRecord(-1);
}
rowBuilder._record = record; // here
DataRow row = NewRowFromBuilder( rowBuilder );
recordManager[record] = row; // here
if (dataSet != null)
DataSet.OnDataRowCreated( row );
return row;
}
... и есть гораздо больше, чего я не следовал. Но ясно, что NewRow()
делает больше, чем просто возвращает новую строку - он изменяет состояние экземпляра DataTable
повсюду.
В документации никогда не говорилось, что это потокобезопасно, но я бы предположил, что, поскольку вам все еще нужно добавить строку в таблицу, NewRow
не изменил DataTable
. Но я был бы неправ, и это определенно не безопасно для потоков.
Еще один флаг в документации для NewRow
После создания DataRow вы можете добавить его в DataRowCollection с помощью свойства Rows объекта DataTable. Когда вы используете NewRow для создания новых строк, строки должны быть добавлены или удалены из таблицы данных перед вызовом Clear.
В нем не сказано, что произойдет, если вы вызовете Clear()
без добавления или удаления строки, созданной с помощью NewRow()
. Исключение? Я умру? Итак, я попробовал. Я все еще здесь, но вызов Clear()
заменил все значения в каждой строке на DBNull.Value
, еще раз подчеркнув, что строки не "освобождены" до тех пор, пока они не будут добавлены в DataTable
. Они являются частью его государства.