什么是同步到文件的XmlWriter访问防止的IOExceptions的最佳方式?
-
22-07-2019 - |
题
有在应用程序中的多个位置,其调用XmlWriter.Create上相同的文件,全部通过以下函数访问。当一个呼叫,而另一个还在写,我得到一个IOException异常。什么是锁定或同步访问的最佳方式?
下面是一个的正在使用的功能:
public void SaveToDisk()
{
try
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
using (XmlWriter writer = XmlWriter.Create(SaveFileAbsolutePath, settings))
{
XamlWriter.Save(this, writer);
writer.Close();
}
}
catch (Exception ex)
{
// Log the error
System.Diagnostics.Debug.WriteLine(ex.Message);
// Rethrow so we know about the error
throw;
}
}
更新:它看起来像这个问题不只是从调用该函数,而是因为另一个线程读取该文件,而这个功能是写的。什么是锁定,所以我们不会尝试写入文件,而它的读取的最佳方式?
解决方案
使用锁可以解决你的并发问题,从而避免了IOException异常,但你必须记住使用上SaveToDisk和ReadFromDisk相同的对象是(我认为这是阅读功能),否则它是完全没用的,只锁定当你读取。
private static readonly object syncLock = new object();
public void SaveToDisk()
{
lock(syncLock)
{
... write code ...
}
}
public void ReadFromDisk()
{
lock(syncLock)
{
... read code ...
}
}
其他提示
一个静态的锁应该快速而简单地做的工作:
private static readonly object syncLock = new object();
...然后
public void SaveToDisk()
{
lock(syncLock)
{
...your code...
}
}
您也可以使用[MethodImpl(MethodImplOptions.Synchronized)]
(上一个的静态强>方法,该方法接受该实例作为参数 - 例如,扩展方法),但是显式的锁是更通用
我其实使用 ReaderWriterLock 以最大化并发。您可以允许多个阅读器,但在一次只有一个作家。
private ReaderWriterLock myLock = new ReaderWriterLock();
public void SaveToDisk()
{
myLock.AcquireWriterLock();
try
{
... write code ...
}
finally
{
myLock.ReleaseWriterLock();
}
}
public void ReadFromDisk()
{
myLock.AcquireReaderLock();
try
{
... read code ...
}
finally
{
myLock.ReleaseReaderLock();
}
}
只要确保打开该文件与 FileShare.Read 使得后续读取不会失败。
不隶属于 StackOverflow