繁体   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