And*_*rey 4 c# multithreading thread-safety parallel-extensions
我遍历一个连接字符串数组,并在每个循环中提取一些信息并添加到列表中.现在,我想使用并行库使其成为多线程,但我不确定该库是否保证对列表的写入是线程安全的,还是我需要使用锁定:
List<SomeType> list = new List<SomeType>();
settings.AsParallel().ForAll(setting =>
{
list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE???
})
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 10
对于多线程写入,写入列表确实不安全.您需要使用a lock来同步访问或使用ConcurrentQueue专为多线程访问而设计的集合.
锁示例(假设list是方法的局部)
List<SomeType> list = new List<SomeType>();
settings.AsParallel().ForAll(setting => {
lock (list) {
list.AddRange(GetSomeArrayofSomeType(setting));
}
});
Run Code Online (Sandbox Code Playgroud)
或者更好地使用SelectMany而不是ForEach
var list = settings
.AsParallel()
.SelectMany(setting => GetSomeArrayOfSomeType(setting))
.ToList();
Run Code Online (Sandbox Code Playgroud)