lock
キーワードは、領域をスレッド、つまりマルチスレッド環境で実行する必要がある場合に使用します。スレッドの残りの部分はその領域を待機します。スタティックコレクションのロックの動作方法
私は複数のクラスで使用されているコレクションIList<Student> student=new List<Student>()
を持っています。
一部の場所では、オブジェクトがリストに追加され、一部の場所ではオブジェクトが削除されています。これにより、一貫性のない動作が発生します。
マルチスレッド環境でクラスxのコレクションをロックすると、コレクションはすべてのクラスに対してロックされ、異なるクラスのすべてのスレッドはロックを待機します。
Class StaticClass
{
Public static IList<Student> student=new List<Student>();
}
Class ClassA
{
//add an item in the collection
}
Class ClassB
{
//delete an item in the collection
}
Class ClassC
{
//lock the collection here
lock (StaticClass.student)
{
foreach (ConnectionManager con in ConnectionManager.GetAllStudents())
{
con.Send(offlinePresence);
}
}
}
ClassCでコレクションをロックすると、classAとClassBの他のスレッドは待機しますか?コレクションがロックされているため、forループが実行されるまで誰もコレクション内の項目を追加または削除できません。
[ConcurrentBag Class](https://msdn.microsoft.com/en-us/library/dd381779(v=vs.110).aspx) –
Fabio
は基本的にはyesですが、別の ' (またはリストを 'readonly'にして)ロックされている間に参照されたオブジェクトが変更されないようにします。 – slawekwin
ループの場合は、リストのコピー(新しいインスタンス)を作成して追加、削除することができますループ中にクラスは影響を受けません。 'foreach(学生の中の生徒のリスト。リスト())...' – Fabio