在C#中保存XML流说,它正在由另一进程使用
题
我有这个的说我有一些麻烦定影开源库一个问题...这个库可以轻松地创建一个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语句。这可能是因为所述方法超越彼此。