英語で読む

次の方法で共有


ICollection.SyncRoot プロパティ

定義

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

C#
public object SyncRoot { get; }

プロパティ値

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

注釈

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

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

コレクションに メソッドがない Synchronized 場合、想定される 使用法 SyncRoot は次のようになります。

C#
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    // Some operation on the collection, which is now thread safe.
}

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

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

C#
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}

適用対象

製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

こちらもご覧ください