Есть ли способ непрерывно отражать результат Console.Write в коллекцию (массив, список и т. Д.)? - PullRequest
5 голосов
/ 20 марта 2011

У меня есть консольная программа, я бы хотел непрерывно отражать результаты Console.Write в коллекцию, которую я могу просмотреть в реальном времени. Коллекция может быть массивом, списком и т. Д.

Полагаю, мне придется использовать какой-то обработчик событий?

Я не против, чтобы меня указывали в сторону сторонней библиотеки, например NLog.

Обновление

Мне нужно сохранить коллекцию в памяти, которая отражает текущее состояние консоли (затем я могу отправить в удаленное приложение WinForms с помощью сокетов). За исключением деталей, я думаю, что я могу сделать это с помощью нескольких строк C # - я не хочу добавлять огромную библиотеку журналов без особой необходимости в этом.

Ответы [ 7 ]

5 голосов
/ 20 марта 2011

Класс Console позволяет заменять потоки вывода и ошибок.Как раз то, что вам нужно здесь, вы можете заменить их TextWriter, который также записывает то, что написаноПример реализации:

    class ConsoleLogger : System.IO.TextWriter {
        private System.IO.TextWriter oldOut;
        private Queue<string> log = new Queue<string>();
        private StringBuilder line = new StringBuilder();
        private object locker = new object();
        private int newline;
        private int logmax;

        public ConsoleLogger(int history) {
            logmax = history;
            oldOut = Console.Out;
            Console.SetOut(this);
        }
        public override Encoding Encoding {
            get { return oldOut.Encoding; }
        }
        public override void Write(char value) {
            oldOut.Write(value);
            lock (locker) {
                if (value == '\r') newline++;
                else if (value == '\n') {
                    log.Enqueue(line.ToString());
                    if (log.Count > logmax) log.Dequeue();
                    line.Length = newline = 0;
                }
                else {
                    for (; newline > 0; newline--) line.Append('\r');
                    line.Append(value);
                }
            }
        }
    }

Использование:

    static void Main(string[] args) {
        var outLogger = new ConsoleLogger(100);
        // etc...
    }
2 голосов
/ 20 марта 2011

Используя Console.SetOut , вы можете установить свой собственный реализованный TextWriter.

2 голосов
/ 20 марта 2011

Вы, вероятно, могли бы написать нового TextWriter, чьи Write вызовы заполняют список вместо записи в поток.Затем вам нужно установить это через Console.SetOut(...)

1 голос
/ 20 марта 2011

Если вы хотите написать код вроде:

    WriteToConsole("{0} tel is: {1:+### ### ### ###}", "Name", 242352356578);

Тогда вы можете иметь код:

    private static Queue<String> q = new Queue<String>(1000);
    private static void WriteToConsole(String message)
    {
        q.Enqueue(message);
        Console.Write(message);
    }
    private static void WriteToConsole(String message, params Object[] r)
    {
        String s = String.Format(message, r);
        q.Enqueue(s);
        Console.Write(s);
    }
1 голос
/ 20 марта 2011

Вы можете создать простой вспомогательный метод и вызывать его вместо Console.Write.

private void WriteToConsole(string message)
{
    myList.Add(message);

    Console.Write(message);
}
0 голосов
/ 28 марта 2011
0 голосов
/ 20 марта 2011

Используйте log4net для непрерывного дампа в файле, а затем используйте это для tail: http://tailf.codeplex.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...