Установка цвета для Console.Error пишет

Я пишу консольное приложение, в котором есть собственный регистратор. Регистратор должен окрашивать все, что отправляется в Console.Error, в красный цвет. Теперь у меня есть сторонние ссылки, которые также пишут в Console.Out и Console.Error, поэтому я должен сделать это таким образом, чтобы они тоже учитывались, поскольку у меня нет их исходного кода. Я настроил свой регистратор так, что любой код, записываемый в консоль, будет использовать TextWriter моего регистратора, вызывая методы Console.SetOut и Console.SetError. Это вроде работает, но я предполагаю, что есть какая-то проблема с синхронизацией? В моем классе ErrorWriter вы можете видеть, что я устанавливаю цвет переднего плана консоли, а затем вызываю base.Write(), но результат не такой, как ожидалось. Текст, поступающий из Console.Out, который должен быть серым, выходит красным, а в середине потока он внезапно становится серым. Он последовательно меняет цвет с красного на серый в одной и той же позиции символа, но я предполагаю, что base.Write() на самом деле не сразу выдает консоль; есть какая-то задержка/буфер. Я пытался вызвать base.Flush(), но это сделало ВЕСЬ текст из Console.Out красным, что еще хуже. Как решить эту проблему?

public class Logger
{
    private static TextWriter _out;
    private static ErrorWriter _error;

    public Logger()
    {
        Initiliaze();
    }

    public static TextWriter Out
    {
        get
        {
            return _out;
        }
    }

    public static TextWriter Error
    {
        get
        {
            return _error;
        }
    }

    private static void Initiliaze()
    {
        if (_out == null)
            _out = new StreamWriter(Console.OpenStandardOutput());
        if (_error == null)
            _error = new ErrorWriter(Console.OpenStandardError());

        Console.SetOut(Out);
        Console.SetOut(Error);
    }
}

public class ErrorWriter : StreamWriter
{
    // constructors omitted to save space

    public override void Write(string value)
    {
            Console.ForegroundColor = ConsoleColor.Red;
            base.Write(value);
            //base.Flush();
            Console.ResetColor();
    }

    public override Encoding Encoding
    {
        get { return Encoding.Default; }
    }
}
5
задан TugboatCaptain 10 May 2012 в 11:11
поделиться