簡體   English   中英

C#后台工作者UI更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM