好吧,这里有一个奇怪的,我无法想到一个好的头衔。
我编写了一个EventLog类,在应用程序为UserInteractive而不是已安装的服务的情况下,将事件日志写入控制台窗口。如果应用程序不是UserInteractive,则按预期写入Windows事件日志
由于多个任务一次使用EventLog,并且有一些颜色发生变化,我必须使用lock
以便没有竞争条件
public class EventLog : System.Diagnostics.EventLog
{
private static object consoleLock = new object();
public new static void WriteEntry(string source, string message, EventLogEntryType type)
{
if (!WriteToConsole(message, type))
{
System.Diagnostics.EventLog.WriteEntry(source, message, type);
}
}
private static bool WriteToConsole(string message, EventLogEntryType type)
{
if (!Environment.UserInteractive) return false;
Task.Run(() =>
{
lock (consoleLock)
{
Console.ForegroundColor = PickConsoleColour(type);
Console.Out.WriteLine("{0}: {1}", type.ToString(), message);
Console.ResetColor();
}
}).ConfigureAwait(false);
return true;
}
private static ConsoleColor PickConsoleColour(EventLogEntryType type)
{
switch (type)
{
case EventLogEntryType.SuccessAudit:
return ConsoleColor.Green;
case EventLogEntryType.Information:
return ConsoleColor.Cyan;
case EventLogEntryType.FailureAudit:
return ConsoleColor.DarkRed;
case EventLogEntryType.Warning:
return ConsoleColor.Yellow;
case EventLogEntryType.Error:
return ConsoleColor.Red;
default:
return ConsoleColor.Gray;
}
}
}
我引爆火灾的原因&忘记任务是因为如果有很多消息试图打印到控制台,我不希望所有对EventLog的调用都被阻止。我也不关心消息的输入顺序 - 所以我不需要排队等等。
因此应用程序运行如下:每隔几分钟,就会创建许多新任务,所有这些任务都可能写入EventLog。
很长一段时间它似乎工作正常,但经过这么长时间(大约30分钟?我还没有计时),消息将停止打印到控制台并且线程计数该过程的发展和成长我认为正在发生的事情是由于某种原因锁定没有被释放,所以很多新的火灾和忘记正在创建被锁定阻止的任务。我无法弄清楚导致这种情况发生的原因,但只要我按下控制台窗口上的任意键 - 繁荣 - 所有消息立即通过,一切都开始工作。