【问题标题】:Running a method in BackGroundWorker and Showing ProgressBar在 BackGroundWorker 中运行方法并显示 ProgressBar
【发布时间】:2012-12-02 04:27:10
【问题描述】:

我想要的是当某些方法正在执行某些任务时,UI 保持自身处于活动状态,并且我想在进度条中显示工作的进度。

我有一个方法,一个BackGroundWorker 和一个Progressbar。我想在BackGroundWorker 开始运行时调用该方法并显示进度。该方法包含一个循环。所以,它可以报告进度。

那么,有什么办法呢?

private void Form1_Load(object sender, EventArgs e)
{
    // TODO: This line of code loads data into the 'dataSet1.TBLMARKET' table. You can move, or remove it, as needed.
    myBGWorker.WorkerReportsProgress = true;
}

private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    parseFiles();
}

private void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    myProgressBar.Value = e.ProgressPercentage;
}

private void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    MessageBox.Show("Done");
}

private void parseButton_Click(object sender, EventArgs e)
{
    myBGWorker.RunWorkerAsync();
}

public void parseFiles()
{
  for()
  {
     //parsing
     myBGWorker.ReportProgress(...);
  }
}

但它不起作用。 Progressbar 没有更新。在MessageBox“完成”之后只显示了一个小进度。

【问题讨论】:

  • 你的 parseFiles 函数是否调用了ReportProgress
  • 是的。在那里。抱歉,我之前忘记添加了。

标签: c# winforms multithreading progress-bar backgroundworker


【解决方案1】:

我很抱歉这个问题。实际上代码工作正常。它没有显示Progressbar,因为myBGWorker.ReportProgress() 中的参数是分数而不是百分比。所以,它没有显示出来。很抱歉给您带来不便。

版主可能会删除此主题。否则它可以作为其他人的教程。

【讨论】:

    【解决方案2】:

    不要使用一种 ParseFiles 方法(应该依赖于 myBGWorker),而是使用解析一个文件的循环和方法。报告该循环中的进度百分比:

    private void parseButton_Click(object sender, EventArgs e)
    {
        parseButton.Enabled = false;
        myBGWorker.RunWorkerAsync();
    }
    
    private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
    {
       for(int i = 0; i < filesCount; i++)
       {  
           ParseSingleFile(); // pass filename here
           int percentage = (i + 1) * 100 / filesCount;
           myBGWorker.ReportProgress(percentage);
       }
    }
    
    void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        myProgressBar.Value = e.ProgressPercentage;
    }
    
    void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        parseButton.Enabled = true;
        MessageBox.Show("Done");
    }
    

    【讨论】:

    • 您能否评论一下如何在 BackGroundWorker 运行时停用按钮。否则会有问题。
    • @soham.m17 当然,在开始解析和解析完成时设置parseButton.Enabled 属性
    • 但它在不同的线程中。所以它应该在RunWorkerCompleted eventHandler 中抛出一个异常。但这不是扔吗?我可以知道为什么吗?
    • RunWorkerCompleted 和 ProgressChanged 事件处理程序在 UI 线程上执行,所以不用担心。如果您在解析过程中遇到一些错误,请检查已完成事件处理程序参数的e.Error 属性。
    • 这仍然会阻止我的用户界面
    【解决方案3】:

    到。 soham.m17 与发件人参数一起使用

    private void myBGWorker_DoWork(object sender, DoWorkEventArgs e)
    {
       var worker = sender as BackgroundWorker;
       for(int i = 0; i < filesCount; i++)
       {  
           ParseSingleFile(); // pass filename here
           int percentage = (i + 1) * 100 / filesCount;
           worker.ReportProgress(percentage);  // use not myBGWorker but worker from sender
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      相关资源
      最近更新 更多