![](/img/trans.png)
[英]BackgroundWorker & Timer, reading only new lines of a log file?
[英]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.