Pergunta

Suponha que estou acessando um DataTable de vários threads. Se eu quiser acessar uma linha específica, suspeito que preciso bloquear essa operação (eu poderia estar enganado com isso, mas pelo menos sei que assim estou seguro):

// this is a strongly-typed table
OrdersRow row = null;
lock (orderTable.Rows.SyncRoot) {
    row = orderTable.FindByOrderId(myOrderId);
}

Mas então, se eu quiser atualizar aquela linha, devo trancar a mesa (ou melhor, a mesa Rows.SyncRoot objeto) novamente, ou posso simplesmente bloquear a linha?

Foi útil?

Solução

Na verdade, apenas executando um lock em um só lugar no DataTable ou Dataarow não Faz nada. Um aspecto importante a lembrar ao usar Monitor bloqueios (que é o que um lock O bloco é) é que travar um objeto não faz nada a ele; Essa é uma das razões pelas quais alguns advogados usando objetos de travamento dedicados, em vez de travar o próprio recurso, uma vez que força você a perceber que precisa executar o bloqueio (e no mesmo objeto) sempre que estiver lidando com o recurso.

Dito isto, é uma ideia melhor trancar todo o DataTable, como o próprio armazenamento de dados está lá (o DataRow Objetos internamente contêm apenas um compensado no DataTable quanto a onde recuperar os dados). Por causa disso, mesmo se você sincronizar o acesso a linhas individuais, atualizando dois diferente As linhas simultaneamente farão com que você atualize o mesmo mecanismo de armazenamento de dados de maneira não sincronizada.

Há um conflito aqui entre a visualização dos tipos internos como uma "caixa preta" e o bloqueio apenas o que você precisa (que, nesse caso, levaria você a uma conclusão defeituosa de apenas travar a linha) e tentar obter informações sobre o trabalho interno do tipo e confiando nos detalhes da implementação Isso pode mudar.

O resultado é que, no momento, você deve travar todo o DataTable Para evitar a atualização do sistema interno de armazenamento de dados de maneira não sincronizada.

Outras dicas

Você não precisa travar para leituras - apenas para gravações / atualizações. Bloqueie a menor quantidade possível, para garantir a consistência dos dados ... geralmente apenas a linha que você está atualizando. Se você estiver atualizando as relações entre pais / filho entre as tabelas, precisará bloquear cada linha em cada tabela.

O DataTable é seguro apenas para operações de leitura com vários rosqueados:

http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx

http://social.msdn.microsoft.com/forums/en-us/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e

Ao ler sobre o DataTable, há informações conflitantes sobre a capacidade de travar a tabela e permitir que você atualize dados com segurança em uma linha. De acordo com o segundo link, você pode bloquear a tabela e atualizar a linha. Sendo isso de um MV MVP, eu diria que você provavelmente pode trancar a mesa e ficar bem.

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