C# 可以使用并行任务更新数据表中的数据行吗?

C# 可以使用并行任务更新数据表中的数据行吗?,c#,datatable,parallel-processing,C#,Datatable,Parallel Processing,我想提高更新数据表行的性能。在一个示例中,我需要对DateTime列进行操作,将System.DateTime值转换为自行生成的包装器类。这意味着,目前,我在Rows集合上循环,并在序列中设置每行的每一列 我现在做的一个例子: dt.Columns.Add(new DataColumn("fldDateCreated", typeof(TypedDateTime))); foreach (DataRow row in dt.Rows) { if (!(row["~fldDateCreat

我想提高更新数据表行的性能。在一个示例中,我需要对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");
我很想同时做这件事,但我的测试证明,DataTable不喜欢这种事情

它们同时表示DataTable和DataRow:

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

我尝试过其他方法,如将行数据捕获到对象[],并行更新,然后根据这些结果更新DataTable。然而,查找和更新每一行的代价似乎比原始循环要昂贵得多

这里有前进的道路吗?我可以以线程/并行方式处理这些行更新吗?

给你

// 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"]));
    });

你为什么要这么做?更新数据表中的行不应该花费太长时间。如果是这样的话,就有问题了。您有多少行?为什么使用数据表而不是普通对象的集合?为什么一开始你的内存中会有很多记录?我假设你有充分的理由使用DataTable,首先。你尝试过并行地做什么?还显示该代码。我怀疑你能否显著提高绩效。也不清楚你为什么需要你的TypedDateTime。如果性能如此重要,而表又如此庞大,以至于您认为需要并行执行,那么为什么不使用数据库呢?或者用一个列表代替弱类型的数据表。1大约10万行;2,因为它将绑定到网格控件以进行显示;3包装器类提供了超越DateTime的内部所需工具。此外,从多个线程处理对象总是会导致问题。诀窍是提取所需的数据,将其分散到多个线程进行处理,然后将其收集回来。换句话说,不要迭代表,提取和处理所有行,例如使用PLINQ,将所有值放在一个集合中。这对解决实际问题没有帮助。OP想要将10万行绑定到一个网格。@PanagiotisKanavos,那么OP应该删除这个问题并询问真正的问题。听起来他想要传呼。