Der Grund, warum Sie es nicht finden können, ist, dass explizit entfernt wurde . Wenn es wirklich das ist, was Sie tun möchten, verwenden Sie SynchronizedCollection<T>
oder erstellen Sie ein dediziertes Synchronisationsobjekt. Der beste Ansatz (im Allgemeinen) besteht darin, ein dediziertes Synchronisationsobjekt zu erstellen, wie Winston veranschaulicht.
Das wesentliche Problem mit der Eigenschaft SyncRoot
ist, dass es ein falsches Gefühl der Sicherheit bietet - es behandelt nur eine sehr begrenzte Anzahl von Umständen. Entwickler vernachlässigen oft die Synchronisation für eine gesamte logische Operation, wenn man annimmt, dass das Sperren auf SyncRoot
gut genug ist.
Sie möchten generell verhindern, dass ein Typ gesperrt wird ( List<T>
in diesem Fall). Wenn Sie beispielsweise zwei Instanzen Ihres Typs haben oder ein anderer Typ eine Sperre für List<T>
verwenden würde, würden alle um eine einzelne globale Sperre konkurrieren. Wirklich, was Sie erreichen wollen, ist die richtige Synchronisation für ein einzelnes Objekt.
Warum möchten Sie List<T>
im Gegensatz zu Ihrer spezifischen Instanz einer Liste sperren?
Es wird oft vorgeschlagen, dass die beste Methode zum Sperren das Sperren eines privaten Objekts ist, das ausschließlich für diesen Zweck erstellt wurde.
%Vor%Eine gute Anleitung zum Einfädeln von C # finden Sie in diesem freien E-Book (Threading in C #) von Joe Albahari.
Sie müssen die generische Liste in ein ICollection
wie folgt umwandeln:
Beachten Sie, dass damit nur der Zugriff auf die Elemente der generischen Liste synchronisiert wird. nicht synchronisiert den Zugriff auf die generische Listenvariable, z. B. myIntList
. Wenn Sie myIntList
irgendwann durch eine neue Liste ersetzen, reicht die Verwendung von SyncRoot
nicht aus. In diesem Fall würde ich empfehlen, ein spezifisches Synchronisationsobjekt zu erstellen, das für beide Synchronisationsszenarien verwendet werden kann.
Die Antwort lautet Ja. Sie können eine Instanz der Liste als Synchronisierungsobjekt verwenden:
%Vor%Sie müssen also die SyncRoot-Eigenschaft nicht verwenden. Darüber hinaus Dokumentation heißt das
Für Sammlungen, deren zugrunde liegender Store nicht öffentlich verfügbar ist, wird der erwartete Implementierung ist, die aktuelle Instanz zurückzugeben.
d. In einigen Fällen gibt die SyncRoot-Eigenschaft das Auflistungsobjekt selbst zurück.
Lesen Sie auch diese Antwort zu SyncRoot.
Zu Ihrer Information: Ich habe SyncRoot-Usages im Produktionscode noch nie gesehen. Daher empfehle ich Ihnen, die Instanz einer beliebigen Sammlung als Synchronisierungsobjekt anstelle der SyncRoot-Eigenschaft zu verwenden (solange die Sammlung privat ist).
Tags und Links c#