我如何锁定在C#.NET在线程的控制台? [英] How do I lock the console across threads in C#.NET?

查看:245
本文介绍了我如何锁定在C#.NET在线程的控制台?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有处理各种信息显示漂亮的颜色的记录类(耶)。然而,由于其写入到控制台中的分离步骤即设置颜色为红色,写文字,设置颜色为灰色,写文,对于一些会呈现[错误]描述。 ..在红的)错误是,但我有一个多线程应用程序,所以步骤可以混合起来,并在随机颜色打印随机的东西。



我知道了锁定关键字,但它不会与静态类,如控制台工作。



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

 ; 
使用System.Text;

命名空间N.Utilities.IO
{
公共静态类的Logger
{
私有静态无效WriteColored(字符串值,ConsoleColor颜色)
{
如果(Logger.UseColor)
{
Console.ForegroundColor =颜色;
Console.Write(值);
Console.ForegroundColor = ConsoleColor.Gray;
}
,否则
{
Console.Write(值);
}
}

私有静态无效WriteLineColored(字符串值,ConsoleColor颜色)
{
如果(Logger.UseColor)
$ { b $ b Console.ForegroundColor =颜色;
Console.WriteLine(值);
Console.ForegroundColor = ConsoleColor.Gray;
}
,否则
{
Console.Write(值);
}
}

私人静态布尔USECOLOR = TRUE;

公共静态布尔USECOLOR
{
得到
{
返回Logger.useColor;
}

{
Logger.useColor =价值;
}
}

公共静态无效的通知(字符串值)
{
Logger.WriteColored([信息],ConsoleColor.White);
Console.WriteLine(值);
}

公共静态无效的警告(字符串值)
{
Logger.WriteColored(【警告】ConsoleColor.Yellow);
Console.WriteLine(值);
}

公共静态无效的错误(字符串值)
{
Logger.WriteColored([错误]ConsoleColor.Red);
Console.WriteLine(值);
}
}


解决方案

您类需求:

 私有静态只读对象ConsoleWriterLock =新的对象(); 



然后你可以在此写入控制台前锁定。

 锁(ConsoleWriterLock)
{这里
//你的代码
}

锁定关键字都会用一个静态类的工作,你只需要提供一个静态只读对象锁定。


I have a logger class that handles various information display with pretty colors (yay.). However, since it writes to the console in separated steps (i.e. set color to red, write text, set color to gray, write text, for something that would render "[Error] Description..." with the error being in red), but I have a multithreaded application, so the steps can get mixed up and print random stuff in random colors.

I am aware of the lock keyword, however it will not work with a static class such as the console.

Here is some example code if I was unclear:

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

解决方案

Your class needs:

private static readonly object ConsoleWriterLock = new object();

Then you can lock on this before writing to the console.

lock(ConsoleWriterLock)
{
     //Your code here
}

The lock keyword will work with a static class, you just need to provide a static readonly object to lock on.

这篇关于我如何锁定在C#.NET在线程的控制台?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆