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