SchemaNameCollection.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