后台工作者的进度栏没有加载

时间:2012-02-20 23:00:13

标签: c# winforms progress-bar

我遇到了一个我似乎无法找到解决方案的问题,我已经阅读了几个答案并且已经知道我需要一个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表单在数据开始收集和处理时显示,并在数据加载完成时消失,但窗口为空喜欢它试图加载,但事实并非如此。我似乎无法弄清楚为什么这不起作用。

后台工作者是不是要为“加载”表单创建单独的线程?或者我的阅读中是否还有其他一些东西?

1 个答案:

答案 0 :(得分:3)

您必须使用ReportProgress()实际报告后台操作的进度。这需要您知道您完成了多少工作。

如果您没有报告进度,进度条将始终保持为0%,直到您的后台操作完成,然后消失 - 这就是您所观察到的。

编辑:

根据您的评论 - 您正在使用选框样式进度条 - 我认为问题在于:

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

我怀疑你从UI线程执行GetData()方法 - 这意味着UI线程被阻止,进度条无法更新。将所有处理移至bwLoading_DoWork方法,使其在单独的线程而不是UI线程上执行 - 然后您的进度条应该更新。同时删除bwLoading.CancelAsync()来电 - 这只会用于取消。