Использование параметров в обработчиках BackgroundWorker - PullRequest
13 голосов
/ 16 июня 2011

Для передачи данных в BackgroundWorker DoWork я использую отдельный экземпляр класса-оболочки:

MyParams mpar = new MyParams();
...
mpar.Par1 = par1val;
mpar.Par2 = par2val;
mpar.Par3 = par3val;
...
var worker1 = new System.ComponentModel.BackgroundWorker();
worker1.DoWork += new DoWorkEventHandler(worker1_DoWork);
worker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker1_RunWorkerCompleted);
worker1.RunWorkerAsync(mpar);

Тогда я могу использовать параметры mpar instance в worker1_DoWork, работая в другом потоке.

void worker1_DoWork(object sender, DoWorkEventArgs e)
 {
      //here we use mpar.Par1, mpar.Par2 and so on
 }

В RunWorkerCompletedEventHandler мы делаем несколько постакций в потоке пользовательского интерфейса.

Мой вопрос: Можем ли мы использовать в обработчике RunWorkerCompleted экземпляр mpar, который работал незадолго до этого в обработчике DoWork, и можем ли мы быть уверены, что его значения такие же, как в DoWork? Если нет, каков правильный подход к разделению параметров для различных этапов операции BackgroundWorker?

void worker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Dispatcher.BeginInvoke((Action)(() =>
        {
            //Can we use the mpar instance here?
        }
        ));
    }

1 Ответ

19 голосов
/ 16 июня 2011

Вы можете присвоить значение e.Result в worker1_DoWork

static void worker1_DoWork(object sender, DoWorkEventArgs e)
{
    //Do the work
    //...

    e.Result = new MyParams();
}

Затем вы можете получить его в worker1_RunWorkerCompleted в e.Result.

Если вам нужнопередать дополнительное значение результата, и вы не хотите помещать объект MyParams в worker1_DoWork: e.Result - тогда вы можете создать небольшой класс ResultHolder с MyParams и MyResult в качестве свойств и использовать этот класс для передачи результата в worker1_DoWork

...