我这里有一个小问题。 我写了一个小的多线程应用程序,它没有做太多,它只是连接到一些资源, reades几个字段将它们写入日志,就是这样。 如果一切都被记录下来,我想知道什么。 以下是日志记录的代码:
private TextWriter textWriter;
private TextWriter errorWriter;
public Logger(string filePath, string errorLogFile)
{
textWriter = TextWriter.Synchronized(File.AppendText(filePath));
errorWriter = TextWriter.Synchronized(File.AppendText(errorLogFile));
}
public void WriteToLog(string text)
{
textWriter.WriteLine(text);
}
...
因此,当我说我有100个线程时,这将管理所有写入日志的数据还是会跳过一些线程? 我将在main中创建一个logger实例并将其传递给executor:
for (int i = 0; i < threadNumber; i++)
{
Executor executor = new Executor(logger)
}
答案 0 :(得分:6)
确实没有跳过。您的代码是线程安全的。
您正在使用TextWriter.Synchronized
创建用于写入文件的线程安全包装器。同步TextWriter
使用[MethodImpl(MethodImplOptions.Synchronized)]
属性实现,该属性基本上与对此方法包含的实例进行锁定相同。
话虽如此,发生的锁定会导致所有其他线程等待,直到当前正在写入的一个线程完成为止
更好的方法是创建一个包含thread safe non-blocking queue的类,在其中放置日志条目,以及一个处理它们的线程并将它们放入日志文件中。如果您的应用程序中正在进行大量日志记录,则很可能会提高性能。