2014-03-05 73 views
0

我有一個windows窗體應用程序,我在其中創建了Panel.I設置了面板True.Inside面板的AutoScroll屬性,我創建了一個RichtextBox.Now按照我的要求我要讀通過符合延遲的每一行到這個RichtextBox.I一個文本文件行已採取定時爲此在frmHome_Load event.I有下面的代碼來做到這一點..在線程中讀取文本文件到面板裏的RichtextBox

private void frmHome_Load(object sender, EventArgs e) 
    { 

     timer1.Interval = 1000; 
     timer1.Start(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     const Int32 BufferSize = 128; 
     using (var fileStream = File.OpenRead("E:\\File\\temp.txt")) 
     using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) 
     { 
      String line; 
      while ((line = streamReader.ReadLine()) != null) 
      { 
       // Process line 
       richTextBox1.Text += line + Environment.NewLine; 

      } 

     } 
    } 

現在有了這個代碼爲,文本文件很大,它使我的窗口窗體應用程序被絞死。意味着我不能做任何事情,除了從任務欄關閉窗口。

爲了解決這個問題,我想用Threads來讀取和顯示textfile.With線程,我想每5秒鐘睡一次,然後從那裏開始。 我想知道這是正確的,將解決我的問題。如果是的如何使用線程做我的發佈代碼相同。 請幫助。

+0

爲什麼一定要逐行添加文本?爲什麼你不能一次添加所有的文本?是否因爲有很多線條? (很多,如成千上萬行。) –

+0

我的要求是逐條顯示讀取的行。而我的文本文件包含一行1行。 – Ram

+0

但它會很快加載這些行,以至於用戶將無法看到逐行添加的行 - 除非您想在添加的每行之間添加延遲(在這種情況下,您應該將該要求添加到問題)。如果沒有,那麼我就看不到逐行添加線的問題。 –

回答

0

如果您使用的是.NET 4.5或更高版本,你可以很容易地做到這一點,如下所示:

protected async override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    string filename = "E:\\File\\temp.txt"; 
    int delayTimeMilliseconds = 5000; 

    // Note: File.ReadLines() defaults to UTF8. 

    foreach (string line in File.ReadLines(filename)) 
    { 
     await Task.Delay(delayTimeMilliseconds); 
     richTextBox1.AppendText(line + "\n"); 
    } 
} 

這裏是一個.NET 4.0的解決方案:

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    Task.Factory.StartNew(loadTextLineByLine); 
} 

private void loadTextLineByLine() 
{ 
    string filename = "E:\\File\\temp.txt"; 
    int delayTimeMilliseconds = 5000; 

    foreach (string line in File.ReadLines(filename)) 
    { 
     Thread.Sleep(delayTimeMilliseconds); 
     string text = line; // Prevent modified closure. 
     this.BeginInvoke(new Action(() => richTextBox1.AppendText(text + "\n"))); 
    } 
} 
+0

我很抱歉,先生,但我使用.net框架4.0 – Ram

+0

@Ram你最好把它放在你的需求 - 否則我們會假設你使用的是最新版本(.net 4.5已經出現了18個月了!) –

+0

我很抱歉,先生。我是非常新的SO.I也會記住這一點。請幫助我 – Ram

0

您正在UI線程中執行耗時的任務(讀取txt文件)。出於這個原因,你的應用程序掛起。

如果您不希望您的方法凍結UI,則應該在與您的UI線程不同的後臺線程中計劃該方法的執行。

要解決此問題,請使用BackgroundWorker線程。 Here一個例子。

+0

目前我不閱讀UI線程also.I閱讀的代碼,我張貼在問題。我需要刪除計時器並使用BackgroundWorker。這將解決我的問題。 – Ram