【问题标题】:Locking AppendAllText vs TextWriter锁定 AppendAllText 与 TextWriter
【发布时间】:2012-01-03 09:20:19
【问题描述】:

关于防止“已在使用”错误,我想问一下,如果从多个客户端多次调用第一个代码 sn-p 是否可能很危险? 还是两个代码块同样安全?

我之所以问是因为第二个 coden-p 调用了一个 close 方法,该方法也执行了一个听起来更安全的 dispose。

//FIRST
lock (_myLock)
{
    File.AppendAllText(_filePath, text);
}


//SECOND
lock (_myLock)
{
    TextWriter tw = new StreamWriter(_filePath, true);
    tw.Write(text);
    tw.Close();
}

【问题讨论】:

  • 为什么不保留它的文件句柄,只要它预期写入?使用锁来控制多个客户端的写入。

标签: c# file process locking textwriter


【解决方案1】:

它们都是一样的。 File.AppendAllText 也调用 Dispose。

private static void InternalAppendAllText(string path, string contents, Encoding encoding)
{
    using (StreamWriter writer = new StreamWriter(path, true, encoding))
    {
        writer.Write(contents);
    }
}

【讨论】:

  • 这种情况下会有打开和关闭文件句柄的开销;如果多个客户端多次调用它,这可能会增加成本。
  • 没错,但这不是 OP 所要求的。
【解决方案2】:

两者同样安全。

由于您已经应用了锁,因此即使从多个客户端调用它,也只有一个线程会在特定时间执行,所以它并不危险,而是第一个选项更简单

正如 MSDN 所说的 AppendAllText 方法

The file handle is guaranteed to be closed by this method

因此,在第一段代码中,.Net 已经在完成您在方法 2 中所做的额外工作

【讨论】:

    【解决方案3】:

    我认为您在后者中所做的事情在调用 File.AppendAllText 时已经在内部得到了照顾

    同样的答案在这里File.AppendAllText vs StreamWriter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2015-07-13
      • 2011-06-26
      • 2011-05-11
      相关资源
      最近更新 更多