有在应用程序中的多个位置,其调用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 使得后续读取不会失败。

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