PropertyCollection.ICollection.SyncRoot プロパティ
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
ICollection へのアクセスを同期するために使用できるオブジェクトを取得します。
property System::Object ^ System::Collections::ICollection::SyncRoot { System::Object ^ get(); };
object System.Collections.ICollection.SyncRoot { get; }
member this.System.Collections.ICollection.SyncRoot : obj
ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot
プロパティ値
ICollection へのアクセスの同期に使用できるオブジェクトです。
実装
注釈
基になっているストアがパブリックではないコレクションの場合、現在のインスタンスを返す実装が要求されます。 現在のインスタンスへのポインターは、他のコレクションをラップするコレクションには十分ではない可能性があることに注意してください。基になるコレクションの SyncRoot プロパティを返す必要があります。
名前空間の System.Collections ほとんどのコレクション クラスでは、基になるコレクションの同期ラッパーを提供する Synchronized メソッドも実装されます。 ただし、派生クラスは SyncRoot プロパティを使って、コレクションの同期されたバージョンを独自に提供できます。 同期コードでは、コレクションを直接操作するのではなく、コレクションの SyncRoot に対して操作を行う必要があります。 こうすることにより、他のオブジェクトから派生したコレクションを適切に操作することができます。 特に、コレクション インスタンスを同時に変更する可能性がある別スレッドとの間で、正常な同期を維持します。
コレクションに Synchronized メソッドがない場合、想定される 使用法 SyncRoot は次のようになります。
ICollection MyCollection =...
lock(MyCollection.SyncRoot) {
// Some operation on the collection, which is now thread safe.
}
Dim myCollection as New ICollection()
SyncLock myCollection.SyncRoot
' Some operation on the collection, which is now thread safe.
End SyncLock
コレクションの列挙は、本質的にスレッド セーフな手続きではありません。 コレクションが同期されていても、他のスレッドがコレクションを変更する場合があり、このときは列挙子から例外がスローされます。 列挙処理を確実にスレッド セーフに行うには、列挙中にコレクションをロックするか、他のスレッドによって行われた変更によってスローされる例外をキャッチします。
次のコード例は、列挙体全体で を使用して SyncRoot コレクションをロックする方法を示しています。
ICollection myCollection = new ICollection();
lock(myCollection.SyncRoot) {
foreach (Object item in myCollection) {
// Insert your code here.
}
}
Dim myCollection As New ICollection()
Dim item As Object
SyncLock myCollection.SyncRoot
For Each item In myCollection
' Insert your code here.
Next item
End SyncLock
適用対象
こちらもご覧ください
.NET