代码之家  ›  专栏  ›  技术社区  ›  Jon Galloway

同步XmlWriter对文件的访问以防止异常的最佳方法是什么?

  •  4
  • Jon Galloway  · 技术社区  · 16 年前

    下面是正在使用的函数:

            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;
            }
        }
    

    更新:看起来问题不只是来自对这个函数的调用,而是因为另一个线程正在读取文件,而这个函数正在写入。什么是最好的锁定方法,这样我们就不会在读取文件时尝试写入文件?

    3 回复  |  直到 16 年前
        1
  •  4
  •   Stefano Driussi    16 年前

    private static readonly object syncLock = new object();
    
    public void SaveToDisk()
    {
         lock(syncLock)
         {
              ... write code ...
         }
    }
    
    public void ReadFromDisk()
    {
         lock(syncLock)
         {
              ... read code ...
         }
    }
    
        2
  •  3
  •   Marc Gravell    16 年前

    静态锁应能快速、简单地完成这项工作:

    private static readonly object syncLock = new object();
    

    然后

    public void SaveToDisk()
    {
        lock(syncLock)
        {
            ...your code...
        }
    }
    

    [MethodImpl(MethodImplOptions.Synchronized)] (在 静止的

        3
  •  1
  •   Phill    14 年前

    实际上我会用一个 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 以便后续读取不会失败。