Necesito hacer RunWorkerAsync()
devolver un List<FileInfo>
. ¿Cómo puedo devolver un objeto de un trabajador de fondo?Cómo hacer que BackgroundWorker devuelva un objeto
Respuesta
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 termine su trabajo, o debe sondear el hilo de trabajo cada cierto tiempo para ver si es hecho y, si es así, obtener el resultado.
La idea de esperar a que un hilo de trabajo devuelva su resultado socava los beneficios del multihilo.
RunWorkerAsync()
inicia el proceso de forma asincrónica y regresará y continuará ejecutando el código antes de que el proceso se complete. Si desea obtener el resultado del BackgroundWorker
, deberá crear una variable de instancia para mantener ese valor y verificarlo una vez que el BackgroundWorker
finalice.
Si quiere esperar hasta que se termine el trabajo, entonces no necesita un BackgroundWorker
.
Usted podría tener su hilo elevar un evento con el objeto como un argumento:
ThreadFinishedEvent(this, new ThreadEventArgs(object));
donde:
public class ThreadEventArgs : EventArgs
{
public ThreadEventArgs(object object)
{
Object = object
}
public object Object
{
get; private set;
}
}
Estoy asumiendo que usted no desea bloquear y esperar en RunWorkerAsync() para los resultados (si lo hizo, no habría ninguna razón para ejecutar async!
Si desea que se le notifique cuando finalice el proceso de fondo, conecte el evento RunWorkerCompleted. Si desea devolver algún estado, devuélvalo en el miembro Result de los argumentos de evento de DoWork.
EDIT: he publicado antes de tiempo - terminó 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...
}
En su controlador de eventos para el DoWork
BackgroundWorker
(que es donde el trabajo de fondo se lleva a cabo) no es un argumento DoWorkEventArgs
. Este objeto tiene un objeto de propiedad público Resultado. Cuando su trabajador haya generado su resultado (en su caso, un List<FileInfo>
), configure e.Result
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());
}
¡Bahhh gracias! – ganjeii
En términos generales cuando se ejecuta un proceso asíncrono, el subproceso de trabajo debe llamar a un delegado o desencadenar 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 obtener más información
- 1. ¿Cómo hacer que un método asíncrono devuelva un valor?
- 2. ¿Cómo puedo hacer que XHR.onreadystatechange devuelva su resultado?
- 3. ¿Se garantiza que un objeto se moverá cuando se devuelva?
- 4. Cómo hacer que Integer.toBinaryString devuelva al menos 4 bits
- 5. ¿Cómo puedo hacer que un método devuelva un argumento que se le pasó?
- 6. ¿Cómo utilizar un BackgroundWorker?
- 7. ¿Cómo puedo hacer que named_scope en Rails devuelva un valor en lugar de una matriz?
- 8. C# ¿Es posible pasar un tipo a un método y hacer que el método devuelva un objeto de ese tipo?
- 9. Objetivo C: ¿hay una ruta de acceso de tecla que hará que un objeto se devuelva?
- 10. ¿Cómo esperar a que un BackgroundWorker se cancele?
- 11. Plantilla de eclipse personalizada para hacer que setter devuelva este objeto?
- 12. Prioridad de subproceso del objeto .NET Backgroundworker
- 13. ¿Cómo puedo hacer que un procedimiento almacenado devuelva un "conjunto de datos" usando un parámetro que paso?
- 14. Cómo hacer que nginx siempre devuelva un 404 personalizado para el host predeterminado
- 15. ¿Cómo hacer que SQL Server devuelva un valor por defecto de 0, si no existen filas?
- 16. ¿Cómo hacer que una función devuelva un puntero a una función? (C++)
- 17. ¿Alternativa a BackgroundWorker que acepta más de un argumento?
- 18. ¿Cómo obtengo System.Windows.ShowDialog() para que devuelva 'verdadero'?
- 19. ¿Cómo hago que MySQL devuelva UTF-8?
- 20. rieles - cómo hacer que un objeto JSON en una vista
- 21. ¿Cómo configuro Apache para que devuelva un código 204?
- 22. ¿Cómo funciona una Llamada bajo el capó? ¿Cómo es posible que un objeto invocable devuelva un valor?
- 23. Cómo detener BackgroundWorker correctamente
- 24. Hacer que PowerShell piense que un objeto no es enumerable
- 25. ¿Cómo puedo hacer que la página php devuelva un error 503 (o cualquier cosa que no sea 200)
- 26. ¿Cómo puedo hacer que SQL Server devuelva FALSE para comparar varchars con y sin espacios finales?
- 27. ¿Cómo puedo hacer que la función php cos devuelva el valor correcto?
- 28. Cómo hacer que Mock devuelva una nueva lista cada vez que se llama al método usando Moq
- 29. BackgroundWorker con métodos anónimos?
- 30. ¿Cómo puedo hacer que 'import x' devuelva una subclase de types.ModuleType?
Hay una diferencia entre la espera y _locking el UI_ mientras lo hace. –
@TSar: Es cierto, aunque en el contexto de trabajar con un componente anterior como 'BackgroundWorker', la semántica de" esperar "es relativamente compleja de lograr (o al menos de demostrar cómo está" esperando "). Algo así es mucho más fácil de expresar con la sintaxis 'async' y' await' ahora y permitiría al desarrollador eliminar la mayoría de los casos de uso de 'BackgroundWorker'. –
Entonces sería bueno complementar su respuesta con las alternativas, en lugar de simplemente decirle al OP que no use BackgroundWorker. Tal como se lee ahora, parece que estás sugiriendo no usar ningún tipo de multi-threading en absoluto, y eso terminaría bloqueando la aplicación hasta que el proceso haya terminado. –