2012-09-11 84 views
1

我有一個函數可以將大量文件添加到集合中,並對它們中的每一個執行很多操作。C#UI線程無響應

這會導致程序(主線程)無響應。

如何確定原因並解決問題?

+0

在另一個線程中啓動您的任務。你使用哪個UI? WinForms或WPF? – opewix

+6

使用backgroundworker來完成在單獨的線程上花費時間的內容,以便UI線程不會掛起。 –

回答

0

使用另一個線程。

Thread t = new Thread(new ThreadStart(() => { 
    IntensiveCalculationCode(); 
})); 

t.Start(); 

您還可以通過調用調度程序從線程內調用UI線程。儘管它們在Windows窗體和WPF上並不完全相同。

+0

我正在使用WPF有什麼不同?在Windows窗體上的 – user1430430

+0

我不記得確切,但在WPF中調用調度器,像'Dispatcher.Invoke(()=> {CodeThatModifiesUIElementsSuchAsChangingTextboxText();});' –

1

使用BackgroundWorker對象。您可以使用ReportProgress和ProgressChanged事件通知用戶操作的進度。

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    backgroundWorker1.WorkerReportsProgress = true; 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 

    // .. stuff that takes long 

    backgroundWorker1.ReportProgress(10); 

    // .. stuff that takes long 

    backgroundWorker1.ReportProgress(20); 

    // .. stuff that takes long 

    backgroundWorker1.ReportProgress(100); 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // Done ! 
} 
+0

太棒了!謝謝你! – user1430430