C# BackgroundWorker报告另一个类中的进度

C# BackgroundWorker报告另一个类中的进度,c#,.net,wpf,events,backgroundworker,C#,.net,Wpf,Events,Backgroundworker,我有一个类似于此链接中最后一个代码的代码: 但是ComputeFibonacci方法在另一个类中,因此我的doWork方法是: private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; e.Resul

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

但是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)时,我的代码将永远锁定应用程序; 在另一个类中的fibonaci方法内部。我认为问题在于backgroundWorker1\u ProgressChanged位于另一个类中,而不是MyClass

请问我该怎么办

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


感谢

使
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;
    }
}

诸如此类。

使
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;
    }
}

类似于此。

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


在ComputeFibonacci方法中,传入BackgroundWorker对象,并调用worker.ReportProgress方法。这应该调用ProgressChanged委托。

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



在ComputeFibonacci方法中,传入BackgroundWorker对象,并调用worker.ReportProgress方法。这应该调用ProgressChanged委托。

ProgressChanged在主线程上激发,ProgressChanged中发生了什么,您认为这是导致问题的原因?你能提供更多的代码吗?这就像我写的链接中的最后一个代码一样。是的,你能详细说明你的backgroundWorker1\u ProgressChanged方法在另一个类中是什么意思吗?你能举个小例子吗?看,在那个链接里。所有方法都在FibonacciForm中。但是我想在另一个类中使用Fibonaci方法,并调用它。还是不明白?所以我使用新的MyClass()调用fibonaci(),我知道如何使用BackgroundWorker。在BackgroundWorker中使用另一个类没有问题,您的问题必须存在于您在另一个类中实际执行的操作中。正如前面的答案所说,您必须有某种循环。我们需要更多关于您的另一个类正在做什么来理解问题的信息。ProgressChanged在主线程上激发,ProgressChanged中发生了什么,您认为这是导致问题的原因?你能提供更多的代码吗?这就像我写的链接中的最后一个代码一样。是的,你能详细说明你的backgroundWorker1\u ProgressChanged方法在另一个类中是什么意思吗?你能举个小例子吗?看,在那个链接里。所有方法都在FibonacciForm中。但是我想在另一个类中使用Fibonaci方法,并调用它。还是不明白?所以我使用新的MyClass()调用fibonaci(),我知道如何使用BackgroundWorker。在BackgroundWorker中使用另一个类没有问题,您的问题必须存在于您在另一个类中实际执行的操作中。正如前面的答案所说,您必须有某种循环。我们需要更多关于你的另一个班级在做什么来理解这个问题的信息。我认为这不是问题所在。我需要backgroundworker,以便能够更新屏幕。fibonaci方法需要很长时间,屏幕会被冻结。编辑我的答案,你应该避免传递给工作人员,使用事件。这里有一点不错的代码,H.B。我打算用
静态
方法为
ComputeFibonaci
编写一个示例,但是,如果使用您定义的其他类方法,我会遇到问题。我尝试过,但不幸的是,屏幕仍然冻结=/您的斐波那契方法是否像terminate中那样工作?您应该尝试设置一些断点,并逐步完成一些关键部分,问题可能在于您没有发布的代码的完全不同部分。我认为这不是问题所在。我需要backgroundworker,以便能够更新屏幕。fibonaci方法需要很长时间,屏幕会被冻结。编辑我的答案,你应该避免传递给工作人员,使用事件。这里有一点不错的代码,H.B。我打算用
静态
方法为
ComputeFibonaci
编写一个示例,但是,如果使用您定义的其他类方法,我会遇到问题。我尝试过,但不幸的是,屏幕仍然冻结=/您的斐波那契方法是否像terminate中那样工作?您应该尝试设置一些断点并逐步完成一些关键部分,问题可能在于未发布的代码的完全不同部分。处理程序可以在任何类中(实例或静态)。它们也可以不在任何类中-匿名方法和lambda也可以工作。处理程序可以在任何类中(实例或静态)。它们也可以完全不在类中-匿名方法和lambda也可以工作。