【问题标题】:How do I lock the console across threads in C#.NET?如何在 C#.NET 中跨线程锁定控制台?
【发布时间】:2010-12-04 02:56:21
【问题描述】:

我有一个 logger 类,可以处理各种颜色漂亮的信息显示(耶。)。但是,由于它以单独的步骤写入控制台(将颜色设置为红色,写入文本,将颜色设置为灰色,写入文本,以获取会呈现“[错误]描述。 ..”,错误为红色),但我有一个多线程应用程序,因此这些步骤可能会混淆并以随机颜色打印随机内容。

我知道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);
            }
    }

【问题讨论】:

    标签: c# console locking logging


    【解决方案1】:

    你的班级需要:

    private static readonly object ConsoleWriterLock = new object();
    

    然后您可以在写入控制台之前锁定它。

    lock(ConsoleWriterLock)
    {
         //Your code here
    }
    

    lock 关键字适用于静态类,您只需要提供一个static readonly 对象即可锁定。

    【讨论】:

    • 非常感谢 :) 正是我需要的。
    • @jasonh 如果另一个应用程序同时写入控制台怎么办? (当然不使用这个记录器)
    猜你喜欢
    • 2016-05-17
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多