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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top