4

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

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

settings.AsParallel().ForAll(setting => 
{
    list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE???
})
4

1 回答 1

10

写入列表对于多线程写入确实不安全。您需要使用 a来同步访问或使用为多线程访问而设计 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();
于 2012-01-09T23:13:42.823 回答