-3

我是 C#.NET 的新手。我试图从我的主 UI 中创建一个带有进度条的表单来显示进度。我使用 BackgroundWorker 来调用它。我能够显示进度对话框,但不能更新进度条值。请在下面找到代码。

主界面:

namespace GC
{
    public partial class MainUI : Form
    {
        private ProgressBar oProgressBar;
        public MainUI()
        {
            InitializeComponent();

        }

        private void runButton_Click(object sender, EventArgs e)
        {
            oProgressBar = new ProgressBar();

            backgroundWorker1 = new BackgroundWorker();

            backgroundWorker1.WorkerReportsProgress = true;

            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);

            backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

            backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

            backgroundWorker1.RunWorkerAsync();

            oProgressBar.ShowDialog();



        }


        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //some work here

            for (int i = 0; i < 20; i++)
                backgroundWorker1.ReportProgress(i);


        }


        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

            oProgressBar.Close();
        }
        void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            oProgressBar.progressBar1.Value = e.ProgressPercentage;

        }

    }

}

进度条 UI此表单包含进度条

namespace GC
{
    public partial class ProgressBar : Form
    {
        public ProgressBar()
        {

            InitializeComponent();

        }


      }
}
4

3 回答 3

1

根据您提供的信息,有几件事可能是问题所在,但这取决于您遇到的行为:

场景 1:进度条表单在看到任何更新之前关闭

问题是您在进度条更新后几乎立即关闭表单。这将发生得如此之快,以至于您将没有时间查看进度条更新。

场景 2:进度条表单保持打开状态,并且进度条永远不会更新

对我来说,这表明您的“Do Work”代码中有错误,导致该ReportProgress函数无法被调用。要检查这一点,我建议使用调试器单步执行代码。


你应该做什么

如果没有意义,像在示例中那样更新 for 循环中的进度条。您的示例将导致进度条立即跳到 20% 并停留在那里。你应该在你的工作过程中的每个“步骤”之后增加进度条。此外,重要的是您的任务实际上需要一些时间来执行(至少一秒钟),以便有时间显示某些内容。

例如,如果您的任务是从数据库中读取记录,那么您可能会在读取每一行后报告进度。我还建议您将其全部包装在 try catch 中并警告任何错误(只是为了知道,以便您可以调试您的问题)...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    try
    {
        //Do Stuff: e.g. read from DB
        var tasks = GetTasks();

        int i = 0;
        double percentageIncrease = 100d / tasks.Count();
        foreach(var task in tasks)
        {
            //do something for this task
            backgroundWorker1.ReportProgress((int)(percentageIncrease * i));
            i++;
        }
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK);
    }
}
于 2013-09-24T13:38:47.037 回答
0

对我来说很好看

我认为你的问题更像是:

  • Windows 在您看到它填充之前关闭,因为:

    oProgressBar.Close();

  • 正如 musefan 所说,你的酒吧只能装满 20%,这是正常的,因为:

    for (int i = 0; i < 20; i++) backgroundWorker1.ReportProgress(i);

如果您想看到它完全填满,请使用 for 循环到 100: for (int i = 0; i < 100; i++)

于 2013-09-24T13:05:48.690 回答
-3

您是否需要在表单线程上调用更新?

void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if(InvokeRequired)
    { 
        Invoke(new EventHandler<ProgressChangedEvent>(backgroundWorker1_ProgressChanged), sender, e);
    }
    else 
        oProgressBar.progressBar1.Value = e.ProgressPercentage;

}
于 2013-09-24T12:51:27.663 回答