BackgroundWorker & Timer, чтение только новых строк файла журнала?

Мое приложение записывает файл журнала (в настоящее время используется log4net ). Я хотел бы настроить таймер и фонового рабочего для чтения файла журнала и вывода его содержимого в какой-либо элемент управления в моей форме, пока он пишется.

Я не могу использовать класс FileSystemWatcher потому что кажется сломанным: иногда событие «меняет» пожары, иногда нет. И у него очень низкая «скорость объединения».

Итак, я создал Timer и FileSystemWatcher. По событию "тик" таймера фоновый рабочий процесс выполняет свою работу.

Вопрос: как читать только те строки, которые были добавлены с момента последней проверки рабочего?

public LogForm()
{
    InitializeComponent();
    logWatcherTimer.Start();
}

private void logWatcherTimer_Tick(object sender, EventArgs e)
{
    FileInfo log = new FileInfo(@"C:\log.txt");
    if(!logWorker.IsBusy) logWorker.RunWorkerAsync(log);
}

private void logWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // Read only new lines since last check.
    FileInfo log = (FileInfo) e.Argument;

   // Here is the main question!
}

РЕДАКТИРОВАТЬ: Код Решение (может быть, есть более элегантный способ?):

private void logWatherWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // retval
    string newLines = string.Empty;
    FileInfo log = (FileInfo) e.Argument;

    // Just skip if log file hasn't changed
    if (lastLogLength == log.Length) return;

    using (StreamReader stream = new StreamReader(log.FullName))
    {
        // Set the position to the last log size and read
        // all the content added
        stream.BaseStream.Position = lastLogLength;
        newLines = stream.ReadToEnd();
    }

    // Keep track of the previuos log length
    lastLogLength = log.Length;

    // Assign the result back to the worker, to be
    // consumed by the form
    e.Result = newLines;
}
11
задан gremo 30 November 2010 в 22:04
поделиться