Como acessar um arquivo com a menor quantidade de bloqueio
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.
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
}