【问题标题】:.NET locking IO code.NET 锁定 IO 代码
【发布时间】:2013-08-16 13:09:05
【问题描述】:

我有几个客户端对象(TCPClient 包装器)在不同的线程上运行。如果这些对象中的任何一个遇到问题,则会将错误消息保存到 XML 错误日志中。显然,文件访问一次仅限于一个进程,所以我需要一种方法来防止其他线程在另一个线程使用它时读取/写入。

我目前正在使用lock 方法,但是仍然抛出异常,表明另一个进程正在使用该文件。我的印象是lock 将管理等待和重试。

// Lock the XML IO for safety due to multi-threading
lock (this.xmlDoc) // Changed from this to the xmlDoc
{
    // Attempt to load existing xml
    try
    {
        this.xmlDoc.Load(this.logPath);
    }
    catch (FileNotFoundException e)
    {
        // xml file doesn't exist, create
        this.xmlDoc.AppendChild(this.xmlDoc.CreateElement("root"));
    }
    // Get the doc root
    XmlElement root = this.xmlDoc.DocumentElement;
    // Create message entry
    XmlElement msg = this.xmlDoc.CreateElement("message");
    // Add <time></time> to msg
    msg.AppendChild(this.xmlDoc.CreateElement("time")).InnerText = dt.ToString();
    // Add <error></error> to msg
    msg.AppendChild(this.xmlDoc.CreateElement("error")).InnerText = message;
    // Add msg to root
    root.AppendChild(msg);
    // Save. Done.
    this.xmlDoc.Save(this.logPath);
}

【问题讨论】:

  • 我最初锁定了这个 - 我理解为什么这是不好的做法 - 但是在专门锁定 XmlDocument 时我得到了相同的结果。 @SLaks 下次发表建设性意见。
  • @Lee:像 log4net 这样的实际日志框架解决了这个问题和许多其他问题,并且可能比手动锁定更有效。
  • @Slaks 我确定他们是,但我怀疑我的简单日志记录要求是否需要使用额外的框架,此外,开发人员不应该用框架来代替理解底层逻辑,我会这样做如果我不能确保我知道如何正确使用锁。
  • 锁定只读对象而不是 xmlDoc。

标签: c# .net xml multithreading locking


【解决方案1】:

lock 不知道文件是什么。它对每个进程都存在的 CLR 对象进行操作。不同的进程会看到不同的对象。

你需要一些跨进程互斥。以下是一些选项:

  1. 一个名为Mutex
  2. 文件级锁定和重试策略(我怀疑 log4net 就是这样做的)
  3. 具有不同名称的多个文件(使用随机名称,以免发生冲突)

选项 3 是最简单的。

【讨论】:

    【解决方案2】:

    如果你所有的线程都来自同一个进程:

    使用 System.Diagnostics.Trace。它内置在框架中,包含线程安全,您可以使用配置文件来定义跟踪侦听器。

    构造一个 XML 字符串,然后 Trace.WriteLine()。

    如果你的线程来自不同的进程,每个进程都需要维护自己的日志文件,正如@usr 提到的那样。

    附带说明,如果音量足够低以避免文件锁定问题,您可以将错误记录到 Windows 事件查看器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2016-12-18
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多