SqlParameterCollection.SyncRoot Propriedade
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Obtém um objeto que pode ser usado para sincronizar o acesso ao 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
Valor de Propriedade
Um objeto que pode ser usado para sincronizar o acesso ao SqlParameterCollection.
Exemplos
O exemplo de código seguinte mostra como bloquear a coleção usando a SyncRoot propriedade durante toda a enumeração.
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
Observações
Este membro é uma implementação explícita de membro de interface. Só pode ser usado quando a SqlParameterCollection instância é transmitida para uma ICollection interface.
Para coleções cujo armazenamento subjacente não está disponível publicamente, a implementação esperada é devolver a instância atual. Note que o ponteiro para a instância atual pode não ser suficiente para coleções que envolvem outras coleções; esses devem devolver a propriedade da SyncRoot coleção subjacente.
A maioria das classes de coleção no System.Collections namespace também implementa um Synchronized método, que fornece um wrapper sincronizado em torno da coleção subjacente. No entanto, as classes derivadas podem fornecer a sua própria versão sincronizada da coleção usando a SyncRoot propriedade. O código de sincronização deve realizar operações sobre a SyncRoot propriedade da coleção, não diretamente sobre a coleção. Isto assegura o funcionamento adequado das coleções derivadas de outros objetos. Especificamente, mantém a sincronização adequada com outros threads que possam estar a modificar simultaneamente a instância de colecção.
Na ausência de um Synchronized método numa coleção, o uso esperado para SyncRoot é o seguinte:
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
Enumerar através de uma coleção não é, intrinsecamente, um procedimento seguro para threads. Mesmo quando uma coleção está sincronizada, outros threads ainda podem modificar a coleção, o que faz com que o enumerador lance uma exceção. Para garantir a segurança dos threads durante a enumeração, pode bloquear a coleção durante toda a enumeração ou apanhar as exceções resultantes de alterações feitas por outros threads.