使用并行库添加到列表时保证线程安全的正确方法

问题描述 投票:0回答:1

我循环访问连接字符串数组,并在每个循环中提取一些信息并将其添加到列表中。现在,我想使用并行库使其成为多线程,但我不确定该库是否保证对列表的写入是线程安全的,或者我是否需要使用锁定:

List<SomeType> list = new List<SomeType>();

settings.AsParallel().ForAll(setting => 
{
    list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE???
})
c# multithreading thread-safety task-parallel-library plinq
1个回答
10
投票

写入列表对于多线程写入来说确实不安全。您需要使用

lock
来同步访问,或者使用像
ConcurrentQueue
这样专为多线程访问而设计的集合。

锁定示例(假设

list
是方法的局部)

List<SomeType> list = new List<SomeType>();
settings.AsParallel().ForAll(setting => { 
  lock (list) {
    list.AddRange(GetSomeArrayofSomeType(setting)); 
  }
});

或者更好的是使用

SelectMany
而不是
ForEach

var list = settings
  .AsParallel()
  .SelectMany(setting => GetSomeArrayOfSomeType(setting))
  .ToList();
© www.soinside.com 2019 - 2024. All rights reserved.