我有这个的说我有一些麻烦定影开源库一个问题...这个库可以轻松地创建一个XML文件来存储应用程序设置。但我有保存更改的问题。

我在那里我使用这个库,每一个应用程序窗口进行调整时另一个应用程序,我调用库的保存()方法来保存窗口大小/位置到XML文件。

大多数时候,它工作得很好,一切都被保存。在一段时间后,虽然,我得到的是被另一个进程异常说该文件。

我真的需要确保更改保存每次保存()方法被调用的时候,我需要以某种方式处理这个异常或防止它发生。

什么是你们最佳的建议处理这种情况?

用于保存()方法中的代码如下:

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();
}
有帮助吗?

解决方案

这可能是因为窗口调整大小完成的事件被如此迅速地射击的情况下,保存功能被调用,再次把它称为完成第一次运行前。这将导致您所描述的错误(使用该文件的其他进程... YOU!)。 尝试,围绕着一个锁代码,正是如此的:

lock(some_shared_object)
{
    //Your code here
}

其他提示

的XmlWriter是IDisposable的。你应该在使用()子句包裹。 http://msdn.microsoft.com/en-us/库/ system.xml.xmlwriter.aspx

我必须去与这里已经给出答案的组合。

您的XmlWriter应该是在一个使用块有几个原因。你应该处理它,这样你的资源尽快释放。此外,虽然与它交互,如果你抛出什么异常。该文件将不被正确关闭,至少直到终结踢,释放你的资源。

即使using语句,你“可能”对文件争,并需要将保存代码lock语句。该方法是不可重入由性质,因为该文件是一个共享资源。把一个锁周围可能超过杀死,如果你不具备多线程,但是你能保证你适当控制对文件的访问。

另外要考虑的是,你可能要在保存操作移动到后台线程来写文件了。如果你得到一个较大的设置文件,因为你在等待的文件到每个用户调整时间写你可能会奇怪的UI交互,这发生在UI线程上。如果你这样做,你肯定会需要锁定访问文件资源。

您也可以尝试使用lock语句。这可能是因为所述方法超越彼此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top