我遇到了一个我似乎无法找到解决方案的问题,我已经阅读了几个答案并且已经知道我需要一个BackgroundWorker线程来使这个解决方案工作,但我我还遇到了一个问题。
我有一个小尺寸的第二个表格,并设置为屏幕中心,其中ProgressBar样式设置为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();
}
}
}
我遇到的问题是,使用此方法,它显示包含进度条的Loading表单在数据开始收集和处理时显示,并在数据加载完成时消失,但窗口为空喜欢它试图加载,但事实并非如此。我似乎无法弄清楚为什么这不起作用。
后台工作者是不是要为“加载”表单创建单独的线程?或者我的阅读中是否还有其他一些东西?
答案 0 :(得分:3)
您必须使用ReportProgress()
实际报告后台操作的进度。这需要您知道您完成了多少工作。
如果您没有报告进度,进度条将始终保持为0%,直到您的后台操作完成,然后消失 - 这就是您所观察到的。
编辑:
根据您的评论 - 您正在使用选框样式进度条 - 我认为问题在于:
GetData()
{
bwLoading.RunWorkerAsync();
//Runs all the processing
bwLoading.CancelAsync();
}
我怀疑你从UI线程执行GetData()
方法 - 这意味着UI线程被阻止,进度条无法更新。将所有处理移至bwLoading_DoWork
方法,使其在单独的线程而不是UI线程上执行 - 然后您的进度条应该更新。同时删除bwLoading.CancelAsync()
来电 - 这只会用于取消。