ICollection.SyncRoot プロパティ

クラスによって実装された場合は、 ICollection へのアクセスを同期するために使用できるオブジェクトを取得します。

ReadOnly Property SyncRoot As Object
[C#]
object SyncRoot {get;}
[C++]
__property Object* get_SyncRoot();
[JScript]
function get SyncRoot() : Object;

プロパティ値

ICollection へのアクセスを同期するために使用できるオブジェクト。

解説

基になっているストアがパブリックではないコレクションの場合、現在のインスタンスを返す実装が要求されます。ただし、他のコレクションをラップするコレクションの場合、現在のインスタンスへのポインタを返すのでは不十分なことがあります。このようなコレクションは、基になっているコレクションの SyncRoot プロパティを返す必要があります。

System.Collections 名前空間内のほとんどのコレクション クラスは、Synchronized メソッドも実装しています。このメソッドは、基になるコレクションをラップする同期されたラッパーを提供します。ただし、派生クラスでは、 SyncRoot プロパティを使用して、独自にコレクションを同期させることができます。コードによる同期操作は、コレクションで直接実行するのではなく、コレクションの SyncRoot で実行する必要があります。これにより、他のオブジェクトから派生したコレクションの操作が正常に実行されます。特に、コレクション インスタンスを同時に変更する可能性がある別スレッドとの間で、正常な同期を維持します。

コレクションが Synchronized メソッドを実装していない場合は、 SyncRoot プロパティを次のように使用します。

 
ICollection MyCollection = ...
lock( MyCollection.SyncRoot ) {
 // Some operation on the collection, which is now thread-safe.
}
[Visual Basic] 
Dim myCollection as New ICollection()
SyncLock myCollection.SyncRoot
 ' Some operation on the collection, which is now thread-safe.
End SyncLock

コレクションの列挙処理は、本質的にはスレッド セーフな処理ではありません。コレクションが同期されている場合でも、他のスレッドがそのコレクションを変更する可能性はあり、そのような状況が発生すると列挙子は例外をスローします。列挙処理を確実にスレッド セーフに行うには、列挙中にコレクションをロックするか、他のスレッドによって行われた変更によってスローされる例外をキャッチする方法のいずれかを実行できます。

[Visual Basic, C#] 列挙処理中に SyncRoot を使用してコレクションをロックする方法を次のコード例に示します。

 
ICollection myCollection = new ICollection();
lock( myCollection.SyncRoot ) {
 foreach ( Object item in myCollection ) {
 // Insert your code here.
 }
}
[Visual Basic] 
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

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard

参照

ICollection インターフェイス | ICollection メンバ | System.Collections 名前空間 | IsSynchronized