Как реализовать регистратор в памяти для последних 100 строк журнала? - PullRequest
2 голосов
/ 16 августа 2011

Как создать эффективный журнал в памяти, в котором хранятся только последние 100 записей и может быстро вывести результирующую строку в TextBox (при каждом обновлении) ?

Я делаю фактическую регистрацию втекстовые файлы, использующие File.AppendAllText, но я хочу иметь возможность просматривать последние записи в моем приложении.

Ответы [ 4 ]

6 голосов
/ 16 августа 2011

Что не так с простой очередью:

Queue<string> _items = new Queue<string>();

public void WriteLog(string value)
{
    _items.Enqueue(value);
    if(_items.Count > 100)
        _items.Dequeue();
}
1 голос
/ 16 августа 2011

Создать массив символов, длина которого составляет maxloglines * maxlogentrywidth .Инициализируйте его для всех пробелов, кроме новой строки каждые maxlogentrywidth символов.В вашем методе регистрации вы смещаете maxlogentrywidth * rowIndex и копируете N символов в строке, после чего копируете maxlogentrywidth-N пробелов после этого.Увеличение rowIndex на (rowIndex + 1)% maxlines .

Чтобы вывести одну строку для использования в окне, объедините две строки с помощью конструктора что позволяет вам индексировать в массив : new string(chararry, curpos, len) + new string(chararray, 0, curpos-1, chararray.Lengs - curpos), где curpos равно maxlogentrywidth * rowIndex .

Вам необходимо добавить соответствующую проверку ошибок ипотокобезопасность конечно.

1 голос
/ 16 августа 2011

Вы смотрели в Log4Net ?

А точнее log4net.Appender.MemoryAppender

0 голосов
/ 17 августа 2011

Возможный подход:

  • ObservableCollection<string>
  • ItemsControl с ItemsTemplate, который является безграничным для чтения TextBox
  • Привязка данных, очевидно.

Конечно, у этого есть свои ограничения, поскольку вы не можете выбирать между элементами, но в этом нет объединения строк, и, используя правильный тип ItemsControl, вы можете использовать виртуализацию при необходимости.

...