vez varias tareas runworkerasync puede progresschanged progressbar ocupado form está este ejemplo ejecutar actualmente c# concurrency asynchronous backgroundworker worker-process

c# - varias - Cómo hacer que BackgroundWorker devuelva un objeto



c backgroundworker (6)

Necesito hacer que RunWorkerAsync() devuelva una List<FileInfo> . ¿Cómo puedo devolver un objeto de un trabajador de fondo?


Dependiendo de su modelo, o bien desea que su hilo de trabajo vuelva a llamar a su creador (o a algún otro proceso) cuando haya terminado su trabajo, o tiene que sondear el hilo de trabajo cada cierto tiempo para ver si está hecho y, si entonces, consigue el resultado

La idea de esperar a que un hilo de trabajo devuelva su resultado socava los beneficios del multihilo.


En su controlador de eventos DoWork para BackgroundWorker (que es donde se realiza el trabajo de fondo), hay un argumento DoWorkEventArgs . Este objeto tiene un objeto de propiedad público Resultado. Cuando su trabajador haya generado su resultado (en su caso, una List<FileInfo> e.Result de e.Result List<FileInfo> ), establezca e.Result en eso, y regrese.

Ahora que su BackgroundWorker ha completado su tarea, desencadena el evento RunWorkerCompleted , que tiene un objeto RunWorkerCompletedEventArgs como argumento. RunWorkerCompletedEventArgs.Result contendrá el resultado de su BackgroundWorker .

ejemplo:

private void bgw_DoWork(object sender, DoWorkEventArgs e) { int result = 2+2; e.Result = result; } private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { int result = (int)e.Result; MessageBox.Show("Result received: " + result.ToString()); }


En términos generales, al ejecutar un proceso asincrónico, el hilo de trabajo debe llamar a un delegado o iniciar un evento (como ChrisF).

Puede ver el nuevo PFX que tiene alguna función de concurrencia que puede devolver valores.

Por ejemplo, hay una función llamada Parallel.ForEach () que tiene una sobrecarga que puede devolver un valor.

mira esto para más información


Estoy asumiendo que no desea bloquear y esperar en RunWorkerAsync () los resultados (¡si lo hiciera, no habría ninguna razón para ejecutar async!

Si desea recibir una notificación cuando finalice el proceso en segundo plano, conecte el evento RunWorkerCompleted. Si desea devolver algún estado, devuélvalo en el miembro Result de los argumentos de evento de DoWork.

EDITAR: Publiqué prematuramente - finalicé mi ejemplo de código

Ejemplo:

private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { // do your thing .... // return results e.Result = theResultObject; } // now get your results private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { MyResultObject result = (MyResultObject)e.Result; // process your result... }


Puedes hacer que tu tema plantee un evento con el objeto como argumento:

ThreadFinishedEvent(this, new ThreadEventArgs(object));

dónde:

public class ThreadEventArgs : EventArgs { public ThreadEventArgs(object object) { Object = object } public object Object { get; private set; } }


RunWorkerAsync() inicia el proceso de forma asincrónica y regresará y continuará ejecutando su código antes de que el proceso se complete. Si desea obtener el resultado de BackgroundWorker , deberá crear una variable de instancia para mantener ese valor y verificarlo una vez que se complete BackgroundWorker .

Si desea esperar hasta que el trabajo haya terminado, no necesita un BackgroundWorker .