Tengo un simple BackgroundWorker que debe generar resultados, pero no sé cómo recuperarlos a mi método de llamada. He leído una serie de respuestas, y todos me muestran cómo el evento RunWorkerCompleted puede recibir los resultados del manejador de eventos DoWork, y para probar esto, muestran un cuadro de mensaje con el resultado. Eso es todo bueno, pero ¿cómo obtengo un resultado de nuevo al método real que llamado RunWorkerAsync ?

myResult=myBackGroundWorker.RunWorkerAsync(); // This obviously doesn't compile

Esta respuesta en particular ha sido muy útil:

Cómo hacer que el hombre de fondo devuelva un objeto

Pero todavía no sé cómo acceder a los resultados. Esta respuesta también menciona el uso de un delegado:

El trabajador de fondo devuelve un valor?

Pero no entiendo si esto resolvería mi problema, o si todavía solo obtendría el resultado dentro del manejador de eventos de RunWorkCompleted.

0
AlePorro 14 jul. 2019 a las 20:32

1 respuesta

La mejor respuesta

Respuesta corta: no puedes.


Piense en lo que significa devolver el valor al método que llamó RunWorkerAsync. Esto significaría que el método tiene que pausar su ejecución, espere a que el trabajador de antecedentes complete su trabajo, luego continúe nuevamente. Pero todavía desea que otros métodos se ejecuten durante la espera, de lo contrario, la UI se congele.

¿Ese sonido te es familiar? Eso es básicamente lo que hace un método un async cuando encuentra una expresión await!

BackgroundWorker es bastante antigua API, y no hubo la característica elegante de Async / Await cuando salió (Async / Await es una función de idioma de todos modos), por eso usa Eventos para hacer el truco. En aquel entonces, no había una manera de hacer una operación de forma asíncrona, y devolver un valor a la persona que llama con elegancia.

Ahora que tenemos Async / AwAit, puedes usarlo para hacer lo que quieras:

someReuslt = await Task.Run(() => { ... });

Si no ha escuchado sobre ASYNC / AWAIT en absoluto, Este es un buen lugar para comenzar.

3
Sweeper 14 jul. 2019 a las 17:43