Pergunta

esta biblioteca de código aberto que eu estou tendo alguns problemas de fixação um problema ... Esta biblioteca permite criar facilmente um arquivo XML para as configurações do aplicativo loja. Mas eu estou tendo um problema salvar as alterações.

Eu tenho uma outra aplicação onde eu estou usando esta biblioteca e cada vez que a janela do aplicativo é feito redimensionamento, eu chamar o método Save () da biblioteca para salvar o tamanho da janela / position para o arquivo XML.

A maioria das vezes ele funciona bem, tudo é salvo. De vez em quando, porém, eu recebo uma exceção dizendo que o arquivo está sendo usado por outro processo.

Eu realmente preciso ter certeza de que as alterações são salvas toda vez que o método Save () é chamado, eu preciso lidar com essa exceção de alguma forma ou de impedir que isso aconteça.

O que vocês estão sugestões para melhor lidar com esta situação?

O código para o método Save () é o seguinte:

public void Save() {
    // Create a new XML file if there's no root element
    if(xDocument.DocumentElement == null) {
        xDocument = new XmlDocument();
        xDocument.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
            "<" + XmlRootElement + ">\n</" + XmlRootElement + ">");
    }

    // OMITTED CODE WAS HERE (NOT IMPORTANT FOR THE PROBLEM)

    // Create a new XML writer for the XML file
    XmlWriter xWriter = XmlWriter.Create(XmlFilePath, new XmlWriterSettings() {
        Indent = true,
        IndentChars = "\t"
    });

    // Sort the XML file using the XSL sylesheet and save it
    xslTransform.Transform(xDocument, xWriter);

    // Clear the buffer and close the XML writer stream
    xWriter.Flush();
    xWriter.Close();
}
Foi útil?

Solução

Ele poderia ser o caso de que os eventos completou-redimensionamento de janela-estão disparando tão rapidamente, que a função de economia está sendo chamado, o chamado novamente antes de terminar em execução pela primeira vez. Isso resultaria no erro que você está descrevendo (outro processo utilizando o arquivo é ... VOCÊ!). Tente em torno de seu código com um bloqueio, desta forma :

lock(some_shared_object)
{
    //Your code here
}

Outras dicas

XmlWriter é IDisposable. Você deve envolvê-la em um usando cláusula (). http://msdn.microsoft.com/en-us/ biblioteca / system.xml.xmlwriter.aspx

Eu tenho que ir com uma combinação das respostas já dadas aqui.

Seu XmlWriter deve estar em um bloco usando por várias razões. Você deve eliminá-lo para que seus recursos são liberados mais rapidamente possível. Além disso, o que se você lançar uma exceção ao interagir com ele. O arquivo não seria fechada, pelo menos até o finalizador entra em ação e libera seus recursos.

Mesmo com a instrução usando, você "pode" ter disputa sobre o arquivo e necessidade de colocar o código Salvar em um comunicado bloqueio. O método é não reentrante, por natureza, porque o arquivo é um recurso compartilhado. Colocar um bloqueio em torno dele poderia ser mais matar se você não tiver vários segmentos, mas você seria garantir que você controlada adequadamente o acesso ao arquivo.

A outra coisa a considerar é que você pode querer mover a operação de salvar em uma discussão de fundo para gravar o arquivo para fora. Se você receber um arquivo de grandes configurações que você pode causar interações UI estranhas porque você está esperando no arquivo para escrever cada vez que o usuário redimensiona e isso acontece no segmento. Se você fez isso você definitivamente precisa de acesso de bloqueio para o recurso de arquivo.

Além disso, você pode tentar usar uma declaração de bloqueio. Pode ser que os métodos são ultrapassagem uns aos outros.

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