Использование параметров в обработчиках BackgroundWorker
для передачи данных BackgroundWorker
' s 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
экземпляр 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 ответов
вы можете присвоить значение 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