簡體   English   中英

后台工作程序中的進度欄​​未加載

[英]Progress Bar in Background Worker not loading

我遇到了一個似乎無法找出解決方案的問題,我已經閱讀了幾個答案,並且知道我需要一個BackgroundWorker線程才能使該解決方案正常工作,但是我仍然遇到了一個問題。

我有一個較小的第二個窗體,它的進度條樣式設置為Marquee,設置為在屏幕上居中,第二個窗體上沒有其他內容,因為它可以模擬加載欄。

在我的代碼的數據密集型部分的主窗體上,它從數據庫中獲取和解析數據,我將其編寫為:

 GetData()
 {
      bwLoading.RunWorkerAsync();
      //Runs all the processing
      bwLoading.CancelAsync();
 }

后台工作人員在主窗體上也定義如下。

 private void bwLoading_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        frmLoading lb = new frmLoading();
        bool running = true;
        while (running)
        {
            if ((worker.CancellationPending == true))
            {
                lb.Close();
                running = false;
            }
            else
            {
                lb.Show();
            }
        }

    }

我遇到的問題是,使用此方法時,它會顯示包含進度條的“正在加載”表單在數據開始收集和處理時會顯示,並且在數據加載完成后會消失,但是窗口卻像嘗試中的那樣是空的加載,但沒有加載。 我似乎無法弄清楚為什么這行不通。

后台工作者不是為“加載”表單創建單獨的線程以供使用嗎? 還是我的閱讀中缺少其他東西?

你必須用實際報告您的后台操作的進度ReportProgress() 這需要您知道已完成多少工作。

如果您不報告進度,則進度條將始終保持為0%,直到完成后台操作為止,此后消失(這就是您正在觀察的內容)。

編輯:

根據您的評論-您正在使用選取框樣式的進度條-我認為問題出在這里:

 GetData()
 {
      bwLoading.RunWorkerAsync();
      //Runs all the processing
      bwLoading.CancelAsync();
 }

我懷疑您是從UI線程執行GetData()方法的-這意味着UI線程被阻止並且進度條無法更新。 將所有處理移至bwLoading_DoWork方法,使其在單獨的線程而不是UI線程上執行-然后,進度條應得到更新。 還要刪除bwLoading.CancelAsync()調用-這僅用於取消。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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