2011-12-18 11 views
6

Tengo un problema para entender que el método BeginInvoke() llama a un delegado cuando llama de manera asincrónica a los métodos, después de completar sus tareas por qué no puede BeginInvoke() devolver el valor de retorno del método, por qué necesitamos EndInvoke() para consultar BeginInvoke() y devolver el valor de retorno de la misma. Sé que esto puede no ser una buena pregunta, pero mi confusión es :-) verdadera¿por qué necesitamos que EndInvoke() devuelva el valor de la llamada asincrónica en delegado?

Adición: puedo llamar a un método de forma asíncrona mediante DelagateName.BeginInvoke (parámetros), ahora cuando el método coincidente en el delegado (supongamos que devuelve un valor) termina su trabajo y devuelve un valor, ¿por qué necesito DelegateName.EndInvoke() para obtener el valor devuelto? ¿Por qué la primera llamada no puede devolver el valor en la finalización del método?

Respuesta

8

Cuando BeginInvoke regresa, el método no ha terminado, ese es el punto de que es asíncrono. Entonces, BeginInvoke solo le puede dar un token que representa la "promesa" de un resultado en algún momento, y usted usa esa promesa para obtener el resultado real usando EndInvoke, generalmente en una devolución de llamada.

En .NET 4 esto se encapsula más agradablemente usando Task y Task<T> por supuesto, pero los genéricos no formaban parte de .NET 1, de ahí el enfoque algo más intrincado para los delegados.

+0

Gracias Jon, eso realmente soluciona mi consulta :-), creo que en el lenguaje de los profanos BeginInvoke se hace al recibir una llamada y devuelve el control con la promesa de que se ocupará del trabajo, por lo que ya no puede devolver el trabajo , por lo tanto, se enviará EndInvoke() para hacer ese trabajo más tarde ... (¡Creo que estoy pensando!) – mohits00691

+0

@ mohits00691: No del todo como lo expresaría, pero creo que tienes la idea correcta :) –

+0

Gracias Jon, me ayudó mucho a despejar esta duda, supongo que con el tiempo seguiré buceando más y más, muchas gracias a todos. – mohits00691

8

Solo necesita BeginInvoke y EndInvoke correspondiente si desea llamar al delegado asincrónicamente, es decir, no bloqueará el hilo actual. Esto es útil para métodos o métodos de larga ejecución que invocan procesos que no controla, p. a través de los límites de la aplicación

Según lo que describa, es mejor utilizar el método Invoke, que devolverá el valor con el mismo método y en el mismo hilo, es decir, sincrónicamente. Por supuesto, su hilo podría ser bloqueado por un proceso de larga ejecución en esta instancia. Depende de lo que estás tratando de hacer.