BackgroundWorker reportProgress в другом классе - PullRequest
1 голос
/ 27 апреля 2011

У меня есть код, похожий на последний код в этой ссылке:

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 (процентComplete); внутри метода Фибоначчи, который находится в другом классе. Я думаю, проблема в том, что backgroundWorker1_ProgressChanged находится внутри другого класса, а не MyClass.

Что мне делать, пожалуйста?

Если я поместу метод Фибоначчи в тот же класс, проблема не возникнет. Но в моем случае не имеет смысла помещать код в тот же класс.

Спасибо

Ответы [ 3 ]

4 голосов
/ 27 апреля 2011

Заставить 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);
}

Нечто подобное.

0 голосов
/ 27 апреля 2011

Обработчик события ProgressChanged должен находиться в том же классе, что и обработчик события DoWork.

В вашем методе ComputeFibonacci вы должны передать объект BackgroundWorker и вызвать метод worker.ReportProgress.Это должно вызвать делегат ProgressChanged.

0 голосов
/ 27 апреля 2011
...