2012-02-03 106 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