アイテムのコレクションを保持するオブジェクトがあります。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();
}
}