是否可以使用并行任务来更新DataTable中的数据行?

时间:2015-02-03 14:11:26

标签: c# datatable parallel-processing

我想提高更新DataTable行的性能。在一个示例中,我需要在DateTime列上操作,将System.DateTime值转换为本地包装类。这意味着,我现在循环遍历Rows集合,并将每行的每一列设置为串联。

我现在所做的一个例子:

dt.Columns.Add(new DataColumn("fldDateCreated", typeof(TypedDateTime)));
foreach (DataRow row in dt.Rows)
{
    if (!(row["~fldDateCreated"] is DBNull))
        row["fldDateCreated"] = new TypedDateTime((DateTime)row["~fldDateCreated"]);
}
dt.Columns.Remove("~fldDateCreated");

我希望能够并行执行此操作,但as MSDN says并且我的测试证明,DataTable不喜欢这类事情。

他们声明(DataTableDataRow):

  

此类型对于多线程读取操作是安全的。你必须   同步任何写操作。

我尝试了将行数据捕获到Object[],并行更新,然后从这些结果更新DataTable等替代方法。但是,查找和更新每一行的价格似乎远远高于原始循环。

这里有前进的方向吗?我可以用某种线程/并行方式处理这些行更新吗?

1 个答案:

答案 0 :(得分:0)

你去,

// referencing
//    System.Data.DataSetExtensions
//    System.Linq.Parallel

dt.AsEnumerable().AsParalell()
    .Where(row => !(row["~fldDateCreated"] is DBNull))
    .ForAll(row =>
    {
        row.SetField(
            "fldDateCreated",
            new TypedDateTime((DateTime)row["~fldDateCreated"]));
    });