0
public static void CalculateAttributions(BackgroundWorker worker, string _filename, ComboBox cmb, OpenFileDialog open)
        {
            worker = new BackgroundWorker { WorkerReportsProgress = true };
            while (wave.Position != length)
            {
               ...Process..
                worker.ReportProgress((100 * (int)(length / wave.Position)) / (int)(length / mainBuffer.Length));
            }
        }

我在一个类中编写了这个方法来执行我的计算并BackgroundWorker用作参数来显示一个Progressbarduring 循环。但是,当我在Form.cs

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = Math.Min(e.ProgressPercentage, 100);
        }

此事件不起作用,因此ProgressBar值不会改变。我怎样才能让它工作?

4

3 回答 3

0

您在此处给出的报告进度事件是针对 backgroundworker1 而不是您在函数 CalculateAttributions(...) 中编码的工作人员

要启用报告进度并更改进度条.. 尝试以下代码

Worker1.ProgressChanged+=new delegate { progressBar1.Value = Math.Min(e.ProgressPercentage, 100); };

具有相同的功能。

希望这可以帮助你

于 2013-10-25T08:18:22.033 回答
0

您将需要附加您的事件处理程序。它应该是这样的。

public static void CalculateAttributions(BackgroundWorker worker, string _filename, ComboBox cmb, OpenFileDialog open)
        {
            worker = new BackgroundWorker { WorkerReportsProgress = true };
    worker.DoWork +=     new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged +=         new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

if (worker.IsBusy != true)
    {
        worker.RunWorkerAsync();
    }

}

 private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            while (wave.Position != length)
            {
               ...Process..
                worker.ReportProgress((100 * (int)(length / wave.Position)) / (int)(length / mainBuffer.Length));
            }
        }

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = Math.Min(e.ProgressPercentage, 100);
        }

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //done
        }
于 2013-10-25T08:33:58.070 回答
0

我认为您应该检查此链接。 http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

这个想法是让你的工作在后台工作人员中。并在每个里程碑之后在进度条上报告进度。

  • 创建后台工作者对象
  • 附加事件处理程序
  • 调用 RunWorkerAsynch()
  • 在事件处理程序中添加代码
    • 做工作将有真正的工作并报告进度电话
    • 报告进度只会告诉您的进度条前进一步
    • 完成后将被调用。您可能希望向用户显示操作已完成的消息。
于 2013-10-25T09:40:28.360 回答