BackgroundWorker reportProgress在另一个班级

时间:2011-04-27 17:56:37

标签: c# .net wpf events backgroundworker

我的代码类似于此链接中的最后一个代码:

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

但是ComputeFibonacci方法在另一个类中,所以我的doWork方法就是这样:


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

            e.Result = new MyClass().ComputeFibonacci((int)e.Argument, worker, e);
        }

当我使用worker.ReportProgress(percentComplete)时,我的代码会永久锁定应用程序。 在斐波纳契方法中,这是另一类。我认为问题是backgroundWorker1_ProgressChanged在另一个类中,而不是MyClass。

我该怎么办?

如果我将fibonaci方法放在同一个类中,则不会出现问题。但就我而言,没有把代码放在同一个类中。

由于

3 个答案:

答案 0 :(得分:4)

MyClass触发一个事件:

public class MyClass
{
    public event ProgressChangedEventHandler ProgressChanged;

    protected virtual void OnProgressChanged(int progress)
    {
        if (ProgressChanged!= null)
        {
            ProgressChanged(this, new ProgressChangedEventArgs(progress, null));
        }
    }

    public int ComputeFibonacci(int input)
    {
        //<Calculate stuff>
        OnProgressChanged(currentProgress);
        //...
        return output;
    }
}
private void backgroundWorker1_DoWork(object sender,
    DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    var myClass = new MyClass();
    myClass.ProgressChanged += (s, pe) => worker.ReportProgress(pe.ProgressPercentage);
    myClass.ComputeFibonacci((int)e.Argument);
}

类似的东西。

答案 1 :(得分:0)

答案 2 :(得分:-3)

ProgressChanged事件处理程序应与DoWork事件处理程序位于同一个类中。

在ComputeFibonacci方法中,您将传入BackgroundWorker对象,并调用worker.ReportProgress方法。这应该调用ProgressChanged代理。