使用并行循环为每个数据行在 C# 中打分

Using Parallel loop to give each datarow a score in C#

我有一种方法可以遍历 DataTable 的每个 DataRow,然后将最终的“Score”列设置为结果。我想弄清楚如何比简单地连续评估更快地做到这一点。我是尝试并行循环的新手,不知道我是否采用了错误的方法。

简化现有代码:

foreach (DataRow dr in DateOptions.Rows) 
{ 
double score = evalRow(dr);
 dr["score"] = score; 
}

使用以下内容似乎会导致错误 - 因为我正在尝试修改 DataTable。

Parallel.ForEach(DateOptions.AsEnumerable(), dr =>
{
    double score = evalRow(dr);
     dr["score"] = score; 
});

有没有什么方法我没有想到提取结果然后将值应用到适当的列?

这可能在很大程度上取决于 evalRow 是否做了任何不是 thread-safe 的事情。如果唯一的问题来自修改数据表,那么您可能可以通过应用 Command-Query 分离来修复它:使用并行处理来确定 做什么 ,然后返回到实际执行的串行处理。

var rowsWithScores = DateOptions.AsEnumerable().AsParallel()
    .Select(dr => new {dr, score = evalRow(dr)})
    .ToList();
foreach(var rowWithScore in rowsWithScores)
{
    rowWithScore.dr["score"] = rowWithScore.score;
}

也就是说,根据我的经验,像这样的问题最好通过算法修复来解决,而不是仅仅尝试对其进行并行处理。如果您只处理 项,并且需要 小时 才能完成,这告诉我您可能正在使用一种算法具有高复杂性(可能可以使用数据结构修复),或者做很多 I/O (这可能有助于并发异步操作)。换句话说,可能还有另一种方法可以使您的性能提高几个数量级。