C#写入带锁的控制台冻结,直到输入密钥

时间:2018-02-22 09:10:45

标签: c# .net

好吧,这里有一个奇怪的,我无法想到一个好的头衔。

我编写了一个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分钟?我还没有计时),消息将停止打印到控制台并且线程计数该过程的发展和成长

我认为正在发生的事情是由于某种原因锁定没有被释放,所以很多新的火灾和忘记正在创建被锁定阻止的任务。我无法弄清楚导致这种情况发生的原因,但只要我按下控制台窗口上的任意键 - 繁荣 - 所有消息立即通过,一切都开始工作。

0 个答案:

没有答案