次の方法で共有


DictionaryBase.ICollection.SyncRoot プロパティ

定義

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

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

プロパティ値

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

実装

次のコード例は、 プロパティを使用して列挙体全体をロック SyncRoot する方法を示しています。

ICollection^ myCollection = gcnew ShortStringDictionary();
bool lockTaken = false;
try
{
    Monitor::Enter(myCollection->SyncRoot, lockTaken);
    for each (Object^ item in myCollection);
    {
        // Insert your code here.
    }
}
finally
{
    if (lockTaken)
    {
        Monitor::Exit(myCollection->SyncRoot);
    }
}
ICollection myCollection = new ShortStringDictionary();
lock(myCollection.SyncRoot)
{
    foreach (Object item in myCollection)
    {
        // Insert your code here.
    }
}
Dim myCollection As ICollection = New ShortStringDictionary()
SyncLock myCollection.SyncRoot
    For Each item In myCollection
        ' Insert your code here.
    Next item
End SyncLock

このプロパティの値を取得することは操作です O(1)

注釈

派生クラスは、 プロパティを使用して、独自の同期バージョンの DictionaryBase クラスを SyncRoot 提供できます。 同期コードは、オブジェクトに対して SyncRoot 直接ではなく、 オブジェクトの DictionaryBase プロパティに対して操作を実行する DictionaryBase 必要があります。 こうすることにより、他のオブジェクトから派生したコレクションを適切に操作することができます。 具体的には、オブジェクトを同時に変更している可能性がある他のスレッドとの適切な同期が DictionaryBase 維持されます。

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

適用対象

こちらもご覧ください