我的代码类似于此链接中的最后一个代码:
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方法放在同一个类中,则不会出现问题。但就我而言,没有把代码放在同一个类中。
由于
答案 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代理。