簡體   English   中英

如何使用BackgroundWorker從日志文件中讀取新行?

[英]How can I use a BackgroundWorker to read in new lines from a log file?

我現在正在創建一個cutom日志文件查看器,它可以很好地處理小文件,但是某些日志文件至少100MB +,並且要處理它們很費勁。

我環顧四周,從中得到的是我可以使用BackgroundWorker進行操作。

到目前為止,我已經嘗試過了:

//calling the background thread to start
BackgroundWorker bgWorker;
bgWorker = new BackgroundWorker();
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.RunWorkerCompleted += 
new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);

bgWorker.RunWorkerAsync(logfile.FileName);

然后在bgWorker_DoWork方法中:

void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    using (StreamReader sr = File.OpenText((string)e.Argument))
    {
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
            //do your stuff here
            e.Result += s + '\n';
        }
    }
}

然后在完成的方法中:

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        MessageBox.Show(e.Error.Message);
    }
    else
    {
        RichTextBox rtb = (RichTextBox)tabControl1.SelectedTab.Controls["rtb"];
        rtb.Text = (string)e.Result;
    }
}

使用此選項可以使GUI停止凍結,但仍然意味着您必須等待BackgroundWorker線程完成才能顯示任何文件。

我想知道是否有一種方法可以使用后台線程加載文件,而僅顯示RichTextBox內部的視圖中的行?

字符串是不可變的
這是非常低效的

e.Result += s + '\n';

采用

e.Result = Sr.ReadToEnd();

如果您想隨時顯示,則可以使用ReportsProgress一次執行1000次操作,但使用StringBuilder而不是+ =

您可以使用線程

new Thread(() => 
{
using (StreamReader sr = File.OpenText((string)e.Argument))
{
    string s = String.Empty;
    while ((s = sr.ReadLine()) != null)
    {
        //do your stuff here
        e.Result += s + '\n';
    }

    SomeTextBox.Dispatcher.BeginInvoke((Action)(() => SomeTextBox.Text = s;));
 }


}).Start();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM