[英]C# Background Worker UI Update
我試圖使用后台工作程序,以便從數據庫中檢索大量數據,而不會拖延主線程。 這看起來效果很好,除了在更新UI時,更新會凍結屏幕。 相關代碼如下:
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lvwTest.BeginUpdate();
lvwTest.Items.Clear();
// Populate the UI
foreach (TestItem ti in testData)
{
ListViewItem lvi = lvwTest.Items.Add(ti.Value1);
lvi.SubItems.Add(ti.Value2);
}
lvwTest.EndUpdate();
}
更新大約需要2到3秒,此時屏幕已鎖定。 我意識到只有主線程可以更新屏幕,但是是否可以以某種方式將這些數據加載到內存中(在后台線程或列表視圖的其他實例或其他東西中)然后只顯示它? 我想要發生的只是讓程序簡單地刷新數據而不占用主線程中的時間。
如果你必須將大量數據加載到UI中,它將需要時間,它將阻止我們的應用程序。 選項是智能滾動或分頁。 您加載所有數據,但您根據用戶請求將其逐個放入。
我建議將數據加載到內存中並使用虛擬模式 ListView
。 這樣,您只需要根據需要創建ListViewItem
對象。
除了虛擬化之外,我還建議將項目分成幾批,比如100,並在每個批次中添加自己的消息。 這樣,當批處理被添加到ListView
,UI有一個更改來處理其他消息。
換句話說,所有RunWorkerCompleted
處理程序都會對第一批進行排隊,以便添加單獨的消息。 然后,添加方法將添加項目,然后排隊下一批。 這將繼續,直到沒有更多項目要添加。 此時,您將重新啟用UI的相關部分( ListView
)。
由於以上大多數都是很好的建議,但並沒有真正解決您的直接問題,這是另一種方法:這將更新您的GUI並保持響應。 假設你在WinForm App中?
Application.DoEvents();
this.Refresh();
然而,這並不意味着你可能不應該聽從上面的想法:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.