2009-10-05 97 views
8

我有一個記錄器類處理各種信息顯示漂亮的顏色(耶)。然而,因爲它寫入到控制檯分開的步驟即設置顏色爲紅色,寫文本,設置顏色爲灰色,寫文本,將呈現的東西「[錯誤]說明...」與錯誤是在紅色),但我有一個多線程應用程序,所以這些步驟可以混合起來,隨機顏色隨機打印。如何通過C#.NET中的線程鎖定控制檯?

我知道lock關鍵字,但它不能用於控制檯等靜態類。

下面是一些示例代碼,如果我還不清楚:

using System; 
using System.Text; 

    namespace N.Utilities.IO 
    { 
     public static class Logger 
     { 
      private static void WriteColored(string value, ConsoleColor color) 
      { 
       if (Logger.UseColor) 
       { 
        Console.ForegroundColor = color; 
        Console.Write(value); 
        Console.ForegroundColor = ConsoleColor.Gray; 
       } 
       else 
       { 
        Console.Write(value); 
       } 
      } 

      private static void WriteLineColored(string value, ConsoleColor color) 
      { 
       if (Logger.UseColor) 
       { 
        Console.ForegroundColor = color; 
        Console.WriteLine(value); 
        Console.ForegroundColor = ConsoleColor.Gray; 
       } 
       else 
       { 
        Console.Write(value); 
       } 
      } 

      private static bool useColor = true; 

      public static bool UseColor 
      { 
       get 
       { 
        return Logger.useColor; 
       } 
       set 
       { 
        Logger.useColor = value; 
       } 
      } 

      public static void Inform(string value) 
      { 
       Logger.WriteColored(" [Info] ", ConsoleColor.White); 
       Console.WriteLine(value); 
      } 

      public static void Warn(string value) 
      { 
       Logger.WriteColored(" [Warning] ", ConsoleColor.Yellow); 
       Console.WriteLine(value); 
      } 

      public static void Error(string value) 
      { 
       Logger.WriteColored(" [Error] ", ConsoleColor.Red); 
       Console.WriteLine(value); 
      } 
    } 

回答

18

類別需要:

private static readonly object ConsoleWriterLock = new object(); 

然後,你可以寫在控制檯前,這個鎖定。

lock(ConsoleWriterLock) 
{ 
    //Your code here 
} 

鎖定關鍵字都會用一個靜態類的工作,你只需要提供一個static readonly對象鎖定。

+0

非常感謝:)正是我需要的。 – Lazlo 2009-10-06 00:00:06

+2

@jasonh如果另一個應用程序同時寫入控制檯會怎麼樣? (當然不會使用這個記錄器) – 2014-05-17 17:39:41