varias - que es backgroundworker c#
Usar parámetros en controladores de BackgroundWorker (1)
Puede asignar el valor de e.Result
en worker1_DoWork
static void worker1_DoWork(object sender, DoWorkEventArgs e)
{
//Do the work
//...
e.Result = new MyParams();
}
Luego puede obtenerlo en worker1_RunWorkerCompleted
en e.Result
.
Si necesita pasar un valor de resultado adicional y no desea poner el objeto MyParams en worker1_DoWork: e.Result
, entonces puede crear una clase pequeña ResultHolder
con MyParams
y MyResult
como propiedades y usar esa clase para pasar el resultado en worker1_DoWork
Para pasar datos a un DoWork
BackgroundWorker
, uso una instancia de clase contenedora separada:
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);
Entonces puedo usar parámetros de la instancia de worker1_DoWork
en worker1_DoWork
, operando en otro hilo.
void worker1_DoWork(object sender, DoWorkEventArgs e)
{
//here we use mpar.Par1, mpar.Par2 and so on
}
En RunWorkerCompletedEventHandler
hacemos algunas postacciones en el hilo de UI.
Mi pregunta es: ¿podemos usar en el controlador mpar
instancia mpar
, que funcionó justo antes en el controlador DoWork
y podemos estar seguros de que sus valores son los mismos que tenía en DoWork
? Si no, ¿cuál es el enfoque correcto para compartir parámetros para varias etapas de funcionamiento de BackgroundWorker
?
void worker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Dispatcher.BeginInvoke((Action)(() =>
{
//Can we use the mpar instance here?
}
));
}