2009-09-30 216 views
1

我有一個簡單的程序,當按下按鈕時循環遍歷結果集並對此結果集執行操作(存儲在DataTable中)。在循環過程中,我更新了RichTextBox,2個標籤和ToolStripStatusLabel的文本。這些在循環過程中不會令人耳目一新,因此在循環中處理每個項目之後,我會執行this.Refresh()。這種方式是有效的,除非我點擊程序中的任何內容,此時它說它沒有響應,並且在foreach循環完成之前沒有任何內容被刷新。.NET窗體窗體刷新控件

private void myBtn_Click(object sender, EventArgs e) 
{ 
    // Query database and store results in DataTable dt. 

    foreach (DataRow dr in dt.Rows) 
    { 
     // Process row data. 
     // Update RichTextBox, labels, and ToolStripStatusLabel. 
     this.Refresh(); 
    } 
} 

這裏有什麼問題嗎?有一個更好的方法嗎?這是一個使用C#的Windows Forms應用程序。

回答

5

它說「沒有響應」,因爲你正在綁定GUI線程。如果你有很長的執行時間,請考慮使用後臺線程。

結賬BackgroundWorker上手。

這裏是threading tutorial,以防萬一。

+0

如果我將這個邏輯移動到後臺線程不會鎖定在該線程?或者可能調用this.Refresh從主線程從後臺線程? – 2009-09-30 15:53:06

+0

你的後臺線程會很忙,但它不會影響GUI(你的程序會保持resonsive)。您需要使用Invoke(或BeginInvoke)從後臺線程對GUI進行更改。 – 2009-09-30 15:55:58

+0

通過在後臺工作中處理此邏輯並通過委託/調用更新ui來實現它。謝謝 – 2009-09-30 21:30:17