ICollection.SyncRoot Propriedade
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Obtém um objeto que pode ser usado para sincronizar o acesso ao ICollection.
public:
property System::Object ^ SyncRoot { System::Object ^ get(); };
public object SyncRoot { get; }
member this.SyncRoot : obj
Public ReadOnly Property SyncRoot As Object
Um objeto que pode ser usado para sincronizar o acesso à ICollection.
Para coleções cujo repositório subjacente não está disponível publicamente, a implementação esperada é retornar a instância atual. Observe que o ponteiro para a instância atual pode não ser suficiente para coleções que encapsulam outras coleções; eles devem retornar 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, classes derivadas podem fornecer sua própria versão sincronizada da coleção usando a SyncRoot propriedade . O código de sincronização deve executar operações na SyncRoot propriedade da coleção, não diretamente na coleção. Isso garante a operação apropriada das coleções que são derivadas de outros objetos. Especificamente, ele mantém a sincronização adequada com outros threads que podem estar modificando simultaneamente a instância da coleção.
Na ausência de um Synchronized
método em uma coleção, o uso esperado para SyncRoot procura da seguinte maneira:
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
A enumeração por meio de uma coleção não é um procedimento thread-safe intrínseco. Mesmo quando uma coleção está sincronizada, outros threads ainda podem modificar a coleção, o que faz o enumerador lançar uma exceção. Para garantir thread-safe durante a enumeração, é possível bloquear a coleção durante toda a enumeração ou verificar as exceções resultantes das alterações feitas por outros threads.
O exemplo de código a seguir 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
Produto | Versões |
---|---|
.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 |
Comentários do .NET
O .NET é um projeto código aberto. Selecione um link para fornecer comentários: