C#で並列処理を行っている中で、スレッドごとにリストを安全に操作するためには、ロックを使用する必要があります。以下に、いくつかの方法とコード例を示します。
-
ロックオブジェクトを使用する方法:
private static readonly object lockObject = new object(); private static List<int> myList = new List<int>(); // ロックを使用してリストを操作するメソッド private static void ModifyList(int item) { lock (lockObject) { // リストにアイテムを追加するなどの処理 myList.Add(item); } } // 並列処理のメソッド private static void ParallelMethod() { // 並列処理でリストを操作する Parallel.ForEach(myList, item => { // リストのアイテムを操作する処理 ModifyList(item); }); }
-
Monitorクラスを使用する方法:
private static List<int> myList = new List<int>(); // ロックを使用してリストを操作するメソッド private static void ModifyList(int item) { bool lockTaken = false; try { Monitor.Enter(myList, ref lockTaken); // リストにアイテムを追加するなどの処理 myList.Add(item); } finally { if (lockTaken) Monitor.Exit(myList); } } // 並列処理のメソッド private static void ParallelMethod() { // 並列処理でリストを操作する Parallel.ForEach(myList, item => { // リストのアイテムを操作する処理 ModifyList(item); }); }
以上の方法を使用することで、C#で並列処理中のスレッドごとにリストをロックして、競合状態やデータ破損を防ぐことができます。必要に応じて、他の同期メカニズムやデータ構造を使用することもできますが、ロックを使用する方法が一般的な解決策となります。注意点としては、ロック範囲を最小限に保つことが重要です。また、ロックの過剰使用はパフォーマンスの低下を引き起こす可能性があるため、適切なバランスを保つ必要があります。