Метод отслеживания BackgroundWorker из другого класса - PullRequest
0 голосов
/ 10 августа 2011

[РЕДАКТИРОВАТЬ]

Я отредактировал свой вопрос с полным кодом и объяснением и надеюсь, что что-то может дать мне более четкое объяснение.

У меня есть следующий класс, который имеетфоновый работник, чтобы отслеживать процент выполнения цикла и обновлять процент выполнения на метке в XAML ProgressWin.Следующий код работает отлично.(Мой вопрос намного ниже, после кода.)

public partial class ProgressWin : Window
{
    BackgroundWorker backgroundWorker1 = new BackgroundWorker();

    public ProgressWin()
    {
        InitializeComponent();
        InitializeBackgroundWorker();
        startAsync();
    }

    // Set up the BackgroundWorker object by 
    // attaching event handlers. 
    private void InitializeBackgroundWorker()
    {
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.WorkerSupportsCancellation = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }

    private void startAsync()
    {
        backgroundWorker1.RunWorkerAsync();
    }

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

        for (int i = 1; i <= 10; i++)
        {
            System.Threading.Thread.Sleep(500);
            worker.ReportProgress(i * 10);
        }
    }

    // This event handler updates the progress.
    public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        label1.Content = (e.ProgressPercentage.ToString() + "%");
    }

    // This event handler deals with the results of the background operation.
    public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
         resultLabel.Content = "Done!";
    }
}

Вот моя проблема, теперь вместо отслеживания цикла в ProgressWin мне нужно отслеживать цикл в моем MainWindow:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        for (int i = 1; i <= 10; i++)
        {
            System.Threading.Thread.Sleep(500);
            ????.ReportProgress(i * 10);
        }
    }
}

И я понятия не имею, куда идти отсюда.Я попытался создать экземпляр объекта из ProgressWin и вызвать DoWork, но в итоге остановил окно ProgressWin.

Ответы [ 2 ]

1 голос
/ 10 августа 2011

В связи с тем, что вопрос был переписан, я также переписал весь свой ответ.

Чтобы заставить это работать, у вашего MainWindow есть ProgressWindow и должен использовать его как фоновый работник:

public partial class MainWindow : Window
{
    private ProgressWindow _Progress;

    public MainWindow()
    {
        InitializeComponent();

        _Progress = new ProgressWindow();
        _Progress.ProgressChanged += OnProgressChanged;

    }

    private void OnProgressChanged(object sender, ProjectChangedEventArgs e)
    {
        //ToDo: Update whatever you like in your MainWindow
    }
}

Для этого ваш ProgressWindow должен просто подписаться на событие работника и перебросить его:

public partial class ProgressWin : Window
{
    // Add this to your class above in your question
    public event ProgressChangedEventHandler ProgressChanged;

    // Change or merge this with your existing function
    private void backgroundWorker1_ProgressChanged(object sender, ProjectChangedEventArgs e)
    {
        var temp = ProgressChanged;
        if(temp !=null)
            temp(this, e);
    }
}
1 голос
/ 10 августа 2011

Вы можете просто вызвать метод другого класса, выполнив

backgroudnWorker.DoWork += new DoWorkEventHandler(SomeClass.SomeStaticMethod);

или

backgroudnWorker.DoWork += new DoWorkEventHandler(SomeClassInstance.SomeMethod);

для вызова метода класса MainWindow из другого класса ProgressScreen у вас должна быть ссылка на экземпляр класса MainWindow в ProgressScreen, затем, используя этот экземпляр, вы можете вызвать любой открытый метод MainWindow из ProgressScreen класс

и, как сказал Оливер Саид, вам понадобится экземпляр backgroundworker для отправки обновлений прогресса другим методом.

...