2012-02-03 105 views
0

我在这里有一个小问题。 我写了一个小的多线程应用程序,它没有做太多,它只是连接到某些资源, 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个线程将这种管理写入的所有数据记录还是会跳过一些线程? 我将创建主记录器的实例,并把它传递给执行人:确实发生

 for (int i = 0; i < threadNumber; i++) 
     { 
      Executor executor = new Executor(logger) 
     } 
+1

考虑使用现有的日志库,而不是另起炉灶。 – CodesInChaos 2012-02-03 10:04:45

+0

我建议[NLog](http://nlog-project.org/) – 2012-02-03 10:05:40

回答

6

没有跳过。你的代码是线程安全的。
您正在使用TextWriter.Synchronized创造写入文件线程安全的包装。同步TextWriter使用[MethodImpl(MethodImplOptions.Synchronized)]属性基本上是一样的这种方法被包含在该实例做了锁来实现。
话虽这么说,出现这种情况的原因所有其他线程锁定等待,直到一个线程是当前写作完成了。
更好的方法是创建一个包含你把你的日志记录到thread safe non-blocking queue和处理它们,并将它们记录到日志文件一个线程类。如果您的应用程序正在进行大量日志记录,这很可能会提高性能。

+0

为什么'非阻塞'? – 2012-02-03 10:39:36

+0

增加效果。写入队列时阻塞所有其他线程优于在写入文件时阻塞所有其他线程,但它*仍然*阻塞所有其他线程。 – 2012-02-03 10:40:58

+0

“非阻塞”,对我来说,意味着单个记录器线程不得不诉诸投票,看看是否有任何新的条目写入文件,但我可以看到你在说什么,(虽然我无论如何,只要每个生产者线程只推送一个对象引用就不会期望太多的争用)。我猜测一个非阻塞的带有信号量的ConcurrentQueue(或者其他一些信号机制)可以让日志写线程等待。 – 2012-02-03 13:49:33