2009-10-05 33 views
8

Tôi có một lớp học logger xử lý hiển thị thông tin khác nhau với màu sắc đẹp (yay.). Tuy nhiên, vì nó ghi vào bàn điều khiển trong các bước riêng biệt (tức là đặt màu thành đỏ, viết văn bản, đặt màu thành màu xám, viết văn bản, cho nội dung sẽ hiển thị "[Lỗi] Mô tả ..." trong màu đỏ), nhưng tôi có một ứng dụng đa luồng, vì vậy các bước có thể được trộn lẫn và in các công cụ ngẫu nhiên với màu sắc ngẫu nhiên.Làm cách nào để khóa bảng điều khiển trên các chủ đề trong C# .NET?

Tôi biết từ khóa lock, tuy nhiên nó sẽ không hoạt động với lớp tĩnh như bảng điều khiển.

Dưới đây là một số mã ví dụ nếu tôi không rõ ràng:

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); 
      } 
    } 

Trả lời

18

nhu cầu lớp của bạn:

private static readonly object ConsoleWriterLock = new object(); 

Sau đó, bạn có thể khóa về vấn đề này trước khi viết ra cửa sổ Console.

lock(ConsoleWriterLock) 
{ 
    //Your code here 
} 

Từ khóa khóa sẽ hoạt động với lớp tĩnh, bạn chỉ cần cung cấp đối tượng static readonly để khóa.

+0

Cảm ơn rất nhiều :) Chính xác những gì tôi cần. – Lazlo

+2

@jasonh Điều gì sẽ xảy ra nếu ứng dụng khác ghi vào Bàn điều khiển trong thời gian chờ đợi? (không sử dụng trình ghi nhật ký này) –

Các vấn đề liên quan