2009-06-02 18 views

Respuesta

0

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.

1

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.

+1

Hay una diferencia entre la espera y _locking el UI_ mientras lo hace. –

+0

@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'. –

+0

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. –

1

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; 
    } 
} 
18

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... 
    } 

 
87

En su controlador de eventos para el DoWorkBackgroundWorker (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()); 
} 
+0

¡Bahhh gracias! – ganjeii

0

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

http://msdn.microsoft.com/en-us/magazine/cc817396.aspx

Cuestiones relacionadas