4

接続文字列の配列をループし、各ループでいくつかの情報を抽出してリストに追加します。今、並列ライブラリを使用してマルチスレッド化したいと考えていますが、リストへの書き込みがスレッドセーフであることをライブラリが保証するかどうか、またはロックを使用する必要があるかどうかはわかりません。

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

リストへの書き込みは、マルチスレッドの書き込みには安全ではありません。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 に答える