【问题标题】:Do the "StreamWriter.WriteLine()" function need to "lock()"?“StreamWriter.WriteLine()”函数是否需要“lock()”?
【发布时间】:2014-09-17 02:41:35
【问题描述】:

我开发了一个类来写日志。它使用“StreamWriter.WriteLine()”函数写入。

logStream.WriteLine(msgWrite);
logStream.Flush();

一些不同的线程使用这个类来写日志,在一个文本文件中(所有线程通用的日志文件)是否需要lock()函数?

我应该更改我的代码吗?

lock(syncObj)
{
    logStream.WriteLine(msgWrite);
    logStream.Flush();
}

请帮帮我。

【问题讨论】:

标签: c#


【解决方案1】:

您应该将您的编写器包装在 TextWriter.Synchronized 中,正如该文档所建议的那样,这可确保所有生成的写入操作都以线程安全的方式执行。

除此之外,是的,您可以使用 lock 来执行此操作,但是当有这样的内置功能时,我倾向于使用它。

快速而简单的实现可能如下所示:

public static class Logs
{
    static Logs()
    {
        _Writer = TextWriter.Synchronized(new StreamWriter(path));
    }

    private static TextWriter _Writer;

    static void LogLine(string line)
    {
        _Writer.WriteLine(line);
    }
}

【讨论】:

  • WriteLine 的线程安全是依赖于实现的,但是如果您查看StreamWriter 及其基础 (TextWriter) 的当前源代码,这绝对不是一个好主意同时调用WriteLine(string),因为它最终会在一个循环中一个一个地写入字符串的字符。
猜你喜欢
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 2013-01-02
相关资源
最近更新 更多