2011-02-09 93 views
1

我有一個ListView控件從BackgroundWorkerReportProgress接收數據。工人連續快速倒出大約一百行。每個數據塊都會觸發ProgressChanged事件,並且GUI線程將新項目添加到ListView在BackgroundWorker中加載數據時GUI凍結

由於數據檢索操作在單獨的線程上運行,所以GUI應該在每次更改時更新。但由於某種原因它不會發生 - 界面在工作人員完成之前一直處於凍結狀態。

任何想法?

此外,測試是在非常快的機器上完成的,所以我不認爲電腦性能是一個問題。

這是一個WinForms應用程序。

+0

SOme代碼片段請... – Aliostad 2011-02-09 11:15:35

+0

還提到WPF或Windows窗體。 – Aliostad 2011-02-09 11:15:50

+0

WinForms。代碼沒有任何特定的內容 - 只需要Worker.ReportProgress(25,newItem)和ListView1.Items.Add(item.DisplayName)。 – SharpAffair 2011-02-09 11:22:11

回答

3

在BGW工人環路將這個,在ReportProgress調用之後:

System.Threading.Thread.Sleep(15); 

賠率是好的,你現在看到的ListView控件更新。這裏發生的事情是UI線程正在充斥着委託調用請求。在繪畫通知之前,它總是被派發。如果下一個調用請求在前一個完成運行之前到達,那麼它永遠不會執行正常的內務處理任務。像繪畫和迴應輸入。這些項目實際上會被添加到列表視圖中,但您無法看到它正在完成。

調用ReportProgress的次數較少。每秒做25次以上是浪費資源,沒有人能看到差異。讓BGW將這些項存儲在列表<>中,並通過調用AddRange()來減少UI線程開銷。

0

即使在快速機器上,在ListView中逐個添加一行也會導致凍結。

嘗試在人口進程前後撥打ListView.SuspendLayout()ListView.ResumeLayout()

+0

剛試過 - 似乎沒有幫助。我見過很多程序正在執行此操作 - 它們會在另一個線程上加載標準ListView並更新每個更改。 – SharpAffair 2011-02-09 11:18:56

1

您可以嘗試使用AddRange而不是Add將項目批量加載到ListView1.Items中。只需填寫一箇中間數組並使用AddRange即可。