SqlParameterCollection.SyncRoot Właściwość
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Pobiera obiekt, który może służyć do synchronizowania dostępu do obiektu SqlParameterCollection.
public:
virtual property System::Object ^ SyncRoot { System::Object ^ get(); };
public override object SyncRoot { get; }
member this.SyncRoot : obj
Public Overrides ReadOnly Property SyncRoot As Object
Wartość właściwości
Obiekt, który może służyć do synchronizowania dostępu do obiektu SqlParameterCollection.
Przykłady
Poniższy przykład kodu pokazuje, jak zablokować kolekcję przy użyciu SyncRoot właściwości podczas całego wyliczenia.
ICollection^ myCollection = someCollection;
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 = someCollection;
lock(myCollection.SyncRoot)
{
foreach (object item in myCollection)
{
// Insert your code here.
}
}
Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
For Each item In myCollection
' Insert your code here.
Next item
End SyncLock
Uwagi
Ten element członkowski jest jawną implementacją składową interfejsu. Można go używać tylko wtedy, gdy SqlParameterCollection wystąpienie jest rzutowanie do interfejsu ICollection .
W przypadku kolekcji, których magazyn bazowy nie jest publicznie dostępny, oczekiwana implementacja ma zwrócić bieżące wystąpienie. Należy pamiętać, że wskaźnik do bieżącego wystąpienia może nie być wystarczający dla kolekcji, które opakowujące inne kolekcje; te powinny zwracać właściwość kolekcji bazowej SyncRoot .
Większość klas kolekcji w System.Collections przestrzeni nazw implementuje również metodę Synchronized , która zapewnia zsynchronizowaną otokę wokół bazowej kolekcji. Jednak klasy pochodne mogą zapewnić własną zsynchronizowaną wersję kolekcji przy użyciu SyncRoot właściwości . Synchronizowanie kodu musi wykonywać operacje we SyncRoot właściwości kolekcji, a nie bezpośrednio w kolekcji. Zapewnia to właściwą operację kolekcji, które pochodzą z innych obiektów. W szczególności utrzymuje właściwą synchronizację z innymi wątkami, które mogą być jednocześnie modyfikowane wystąpienie kolekcji.
W przypadku braku Synchronized metody w kolekcji oczekiwane użycie wygląda SyncRoot następująco:
ICollection^ myCollection = someCollection;
bool lockTaken = false;
try
{
Monitor::Enter(myCollection->SyncRoot, lockTaken);
// Some operation on the collection, which is now thread safe.
}
finally
{
if (lockTaken)
{
Monitor::Exit(myCollection->SyncRoot);
}
}
ICollection myCollection = someCollection;
lock(myCollection.SyncRoot)
{
// Some operation on the collection, which is now thread safe.
}
Dim myCollection As ICollection = someCollection
SyncLock myCollection.SyncRoot
' Some operation on the collection, which is now thread safe.
End SyncLock
Wyliczanie za pośrednictwem kolekcji nie jest wewnętrznie procedurą bezpieczną wątkowo. Nawet w przypadku synchronizacji kolekcji inne wątki nadal mogą modyfikować kolekcję, co powoduje zgłoszenie wyjątku przez moduł wyliczający. Aby zagwarantować bezpieczeństwo wątków podczas wyliczania, możesz zablokować kolekcję podczas całego wyliczenia lub przechwycić wyjątki wynikające ze zmian wprowadzonych przez inne wątki.