Pergunta

no meu aplicativo (c # 3.5) existem vários processos acessando um único arquivo xml (ler e escrever) com muita freqüência. o código de acesso ao arquivo é colocado em uma montagem referenciada por um bom par de outras aplicações. por exemplo, um serviço do Windows pode instanciar a classe MyFileReaderWriter (locatied no mencionado anteriormente montagem) e usar os métodos de leitura / gravação desta classe.

eu estou procurando a melhor maneira / mais rápido para ler e criar / anexar o arquivo com a menor quantidade de bloqueio. cache os arquivos de dados e liberando novos conteúdos periodicamente não é uma opção, uma vez que os dados são críticos.

Eu esqueci de mencionar que eu uso atualmente o XDocument (infra-estrutura LInq2Xml) para ler / escrever o conteúdo para o arquivo.

Foi útil?

Solução

Para começar, certifique-se de que todo o acesso ao documento XML é feito através de uma única instância.

Em seguida, coloque um mecanismo de bloqueio (que espera para desbloquear) no início da função que acessá-lo e desbloqueá-lo no final.

Outras dicas

Se escrevendo você está anexando apenas para o documento, em seguida, tentar este

http://msdn.microsoft.com/en-us/library /aa302289.aspx

Basicamente seu documento XML é uma concha com uma marca de início e fim. Entre as tags é um include de referência, que faz referência a outro arquivo, esse outro arquivo é o corpo do documento xml. Para operações de gravação esta é muitas vezes mais rápido, porque você não tem que carregar o arquivo xml cada vez que você escreve para ele, e você não escrever todo o arquivo de cada vez.

Usando uma classe XmlWriter você pode facilmente adicionar nós ao final do arquivo corpo.

Quando os outros querem ler o xml, eles simplesmente abrir o documento, o analisador xml "sabe" para carregar e analisar os dois arquivos.

Espero que isso ajude.

O que quer dizer que os dados é crítico? É o arquivo XML não é usado exclusivamente pela sua aplicação?

Por mais simples (e talvez suficientemente bom) maneira de bloquear o acesso IO para o arquivo seria a criação de uma classe de fábrica estático que proporciona uma "leitura e escrita token" objeto que cada operação de I / O teria que ter um bloqueio no.

public static object GetReadWriteToken(String fileName)
{
    //use a hashtable to retreive an object, with filename as key
    return token;
}

e simplesmente fazer isso ao ler e escrever:

lock(GetReadWriteToken(@"C:\important.xml"))
{
    //io code
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top