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