SyncLock na SyncRoot
-
12-09-2019 - |
Pergunta
Eu criei uma fila sincronizada e estou usando SyncLock na propriedade SyncRoot de essa fila quando eu chamar os métodos Enqueue / Dequeue. Os métodos são invocados a partir de instâncias de classes padrão de produtor / consumidor.
Isso é um uso adequado da propriedade SyncRoot?
Seria melhor prática para criar um objeto compartilhado privado em cada classe e bloqueio em que, em vez?
Por favor, explique o seu raciocínio.
Solução
Sim, isso é exatamente o que a propriedade SyncRoot
é para. Em particular, isso significa que se uma outra coleção "wrapper" é criado, ele provavelmente irá usar o mesmo SyncRoot
, para que todos ainda pode sincronizar corretamente.
Você poderia criar seu próprio objeto de bloqueio, e que iria fazer absolutamente certo que ninguém mais bloqueada, ao mesmo tempo - mas também significaria que outro código Não foi possível trabalhar com segurança com a mesma coleção. Realmente depende do cenário - é outro código capaz de usar a mesma coleção? É que outro código sob o seu controle?
Note que você deve tirar um bloqueio para todas operações, não apenas Enqueue / Dequeue. Em particular, se você quiser iterar sobre a coleção que você deve manter o bloqueio para que o tempo todo, como uma mudança no meio irá invalidar o iterador.