-1

我正在处理 +100000 行并实现并行。这可以加快处理速度。

逻辑行为是:100000 条记录,其中有 85000 个 groupId,这意味着 MyItems 应该包含 85000 条记录。

事实并非如此...我最终得到的金额与 85000 不同

过程如下:

从数据库中获取所有值

获取整数数组中的所有 ID(不是行 ID,而是 groupId)

处理 groupId 的

var myItems = new List<MyItem>(IDCounter.Length);

Parallel.For(0, IDCounter.Length, (i, loopState) =>
{
  if(!SomeParameter)
    loopState.Stop();

  var records = (from m in AllValues where m.GroupId == IDCounter[i] select m).ToList();

  var recordList = new List<MyRecords>();

  for(var j = 0; j<records.Count; j++)
  {
    recordList.Add(new MyRecord{Text = records[j].OtherValue});
  }

  myItems.Add(new MyItem(Text = records[0].SomeValue, List = recordList));

});

有什么想法吗?

4

2 回答 2

3

myItems.Add同时调用多次。确保它是线程安全的。

于 2014-10-02T12:10:49.557 回答
2

为了确保您不会同时将项目添加到列表中,您可以使用并发集合

命名空间提供了几个线程安全的集合类,当多个线程同时访问集合时System.Collections.Concurrent,应该使用它们来代替System.Collections 和命名空间中的相应类型。System.Collections.Generic

一个示例是使用 a,ConcurrentBag因为您无法保证将添加项目的顺序。

表示一个线程安全的、无序的对象集合。

另一种方法是在添加到列表时使用锁,以确保在任何给定时间只添加一个项目。

于 2014-10-02T12:12:58.383 回答