アイテムのコレクションを保持するオブジェクトがあります。AddItem メソッドを使用してコレクションにアイテムを追加し、コレクション内のすべてのアイテムを調べたいと考えています。私のオブジェクトはスレッドセーフでなければなりません。適切な同期を保証するために ReaderWriterLockSlim を使用しています。GoThroughAllItems メソッドを同期するにはどうすればよいですか? 全体の期間全体にわたって大きな ReadLock を開始する必要がありますが、これは非常に長くなる可能性があります。それとも、コレクションからフェッチされた各アイテムのロックを解放し、次のアイテムのために再度ロックを取得する必要がありますか?
サンプルコードは次のとおりです。
プライベート ReaderWriterLockSlim @lock = new ReaderWriterLockSlim(); プライベート リスト項目 = 新しいリスト(); public void AddItem(項目項目) { this.@lock.EnterWriteLock(); 試す { //アイテムを処理してコレクションに追加する this.items.Add(アイテム); } 最後に { this.@lock.ExitWriteLock(); } } public void GoThroughAllItems() { this.@lock.EnterReadLock(); 試す { foreach (this.Items 内の Item アイテム) { #if オプション 2 this.@lock.ExitReadLock(); #endif //アイテムの処理。時間がかかる場合があります #if オプション 2 this.@lock.EnterReadLock(); #endif } } #if オプション 2 キャッチ #endif #if オプション 1 最後に #endif { this.@lock.ExitReadLock(); } }