c# - Uso básico de BackgroundWorker con parámetros
parameters (4)
La forma más sencilla que me viene a la mente es crear una clase con una propiedad para cada objeto que tenga y pasarla.
public class MyWorkerContext
{
public Object1 Worker;
public Object2 Parameter1;
public Object2 Parameter2;
}
entonces en el DoWork simplemente haces algo como:
MyWorkerContext context = e.Argument as MyWorkerContext;
context.Worker.Method(context.Parameter1, context.Parameter2);
El método de mi proceso intensivo de llamada que deseo realizar en un subproceso en segundo plano es así:
object.Method(paramObj, paramObj2);
Los tres de estos objetos son los que he creado. Ahora, a partir de los ejemplos iniciales que he visto, puede pasar un objeto al método DoWork de un trabajador de fondo. ¿Pero cómo debo hacer esto si necesito pasar parámetros adicionales a ese objeto, como lo estoy haciendo aquí? Podría envolver esto en un solo objeto y terminar con él, pero pensé que sería inteligente obtener el aporte de alguien más sobre esto.
Puede pasar cualquier objeto al argumento objeto de la llamada RunWorkerAsync y luego recuperar los argumentos dentro del evento DoWork. También puede pasar argumentos del evento DoWork al evento RunWorkerCompleted utilizando la variable Resultado en el DoWorkEventArgs.
public Form1()
{
InitializeComponent();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
object paramObj = 1;
object paramObj2 = 2;
// The parameters you want to pass to the do work event of the background worker.
object[] parameters = new object [] { paramObj, paramObj2 };
// This runs the event on new background worker thread.
worker.RunWorkerAsync(parameters);
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
object[] parameters = e.Argument as object[];
// do something.
e.Result = true;
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
object result = e.Result;
// Handle what to do when complete.
}
Puede pasar un objeto al método BackgroundWorker.RunWorkerAsync (). Debería envolver sus dos paramObjs en un Objeto (podría usar una matriz, una tupla o alguna otra clase compuesta que escribiría) y pasarlo como argumento a RunWorkerAsync ().
Luego, cuando se genera el evento DoWork, puede recuperar estos valores observando la propiedad Argumento del parámetro DoWorkEventArgs del controlador de eventos.
Para ver un ejemplo completo, visite MSDN: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=VS.90%29.aspx
Puedes capturarlos en un lambda para DoWork:
bgw.DoWork += (sender, e) => object.Method(paramObj, paramObj2) ;
e.Argument
(es decir, el valor de estado u objeto pasado a BackgroundWorker.RunWorkerAsync()
) podría ser 1 de los 3, pero es de tipo System.Object
y requeriría boxeo. Pasar todos los parámetros directamente en la lambda le brinda una seguridad de tipo completa en todos los parámetros sin necesidad de boxeo o fundición.