【问题标题】:C# BackgroundWorker not working as parameterC# BackgroundWorker 不能作为参数工作
【发布时间】:2013-10-25 08:11:38
【问题描述】:
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 值未更改。我怎样才能让它工作?

【问题讨论】:

  • 你为什么要在方法中创建一个 new BackgroundWorker?你在任何地方调用 BackgroundWorker.RunWorkerAsync 吗?您是否将事件处理程序附加到任何地方的工作人员?基本上,这看起来根本不像使用 BackgroundWorker 的“正常”方式......
  • 感谢您的第一个问题。我刚刚创建了新的 BackgroundWorker 来设置 WorkerReportsProgress = true。我应该从 backgroungWorker1 的属性中做到这一点,然后它就可以工作了。但是我没有写 BackgroundWorker.RunWorkerAsync。我不知道我应该把它放在哪里。
  • 嗯,这就是启动后台工作者...

标签: c# loops progress-bar backgroundworker


【解决方案1】:

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

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

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

在同一个函数中。

希望对你有帮助

【讨论】:

    【解决方案2】:

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

    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
            }
    

    【讨论】:

    • 我想我必须把我的方法移到Form.cs 来执行这些?
    【解决方案3】:

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

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

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

    【讨论】:

    • 我认为我的问题是我现在不知道如何在使用类时从 Form.cs 调用事件。
    猜你喜欢
    • 2011-07-18
    • 2020-05-30
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2018-04-24
    相关资源
    最近更新 更多