2009-10-05 3 views
8

私はきれいな色(イェーイ。)との各種情報の表示を扱うロガークラスを持っています。しかし、それはコンソールにの手順で書かれているので、)の色を赤に設定し、テキストを書き、色を灰色に設定し、テキストを書いて、「[Error] Description ...」というエラーを表示します赤で)、私はマルチスレッドのアプリケーションを持っているので、ステップが混乱しランダムな色でランダムなものを印刷することがあります。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

+2

@jasonh別のアプリケーションからコンソールへの書き込みがあった場合はどうなりますか? (これはもちろんこのロガーを使用しません) –

関連する問題