2009-08-30 20 views
5

Me confunden algunos términos al leer documentos de MSDN y ejemplos de código.Devolución de llamada sincrónica y asíncrona

¿Qué son las devoluciones de llamada en C#? En particular, ¿qué son las devoluciones de llamada sincrónicas y asincrónicas?

Explique esto desde el punto de vista de un lego.

Además, explique la interfaz IAsyncCallbackIAsyncResult. ¿Cómo podemos implementarlo? (con un ejemplo muy simple)

Gracias de antemano.

Respuesta

13

La interfaz IAsyncCallback no existe, por lo que no puede implementarla.

Sospecho que en realidad quieres saber sobre el IAsyncResult interface.

Le recomiendo que lea this page en MSDN.


El IAsyncResult interface representa una operación (por ejemplo, una petición web o una llamada base de datos) que se ejecuta en segundo plano, mientras que el código continúa ejecutándose. Le puede decir si la operación finalizó (la propiedad IsCompleted). También le da una WaitHandle object (la propiedad AsyncWaitHandle) que se puede usar para esperar hasta que finalice la operación. (Llamando result.AsyncWaitHandle.WaitOne())

Usted consigue una IAsyncResult llamando a un método BeginWhatever. (BeginExecuteReader, BeginGetResponse, y muchos otros). El método BeginWhatever tomará los parámetros necesarios para la operación (Por ejemplo, BeginExecuteReader puede tomar un parámetro CommandBehavior), y puede tomar un delegado AsyncCallback (no interfaz) y un parámetro de estado. En devuelve un objeto IAsyncResult.

El delegado AsyncCallback es un método que usted proporciona, que se ejecutará cuando la operación finalice. Generalmente se llamará a un hilo diferente, así que ten cuidado. Su método AsyncCallback tendrá el mismo IAsyncResult que el método BeginWhatever que le dio anteriormente. El parámetro de estado se coloca en IAsyncResult e ignorado por el sistema; puede usarlo en su método AsyncCallback para hacer un seguimiento de para qué era la operación.(El estado puede ser lo que quiera que sea, incluyendo null)

Dentro de su AsyncCallback (o en cualquier otro lugar), se puede llamar al método EndWhatever que se corresponde con el método BeginWhatever os llamó por la primer lugar. Debe darle IAsyncResult desde BeginWhatever o desde AsyncCallback. Cuando lo llame, esperará a que finalice la operación (si aún no ha terminado) y luego le devolverá el resultado de la operación. (Suponiendo que la operación devuelve algo, por ejemplo, WebRequest.EndGetResponse devolverá un WebResponse). Si se produce algún error durante la operación, EndWhatever arrojará una excepción.


Debería implementar IAsyncResult si desea crear su propia operación que se pueda ejecutar en segundo plano. También crearía BeginWhatever y EndWhatever métodos que lo devuelven y lo toman, respectivamente. Para obtener más información sobre la implementación de IAsyncResult, consulte here.

+0

Error de error tipográfico. Como ha dicho, necesito una aclaración sobre IAsyncResult.Gracias por su explicación. – user160677

+2

Excelente explicación muchas gracias – user160677

2

Una devolución de llamada no es más que un delegado. El término devolución de llamada se usa porque generalmente se pasa (el delegado) a un método (como argumento) y luego se invoca en ese método para señalar algo.

Las devoluciones de llamada por sincronización y Async son eso. Sincrónico, ejecute en el mismo hilo que llamó al método (comenzó la acción). Async generalmente se ejecuta en otro hilo (pero no siempre)

La interfaz IAsyncCallback es una plantilla para iniciar una tarea asincrónica. Usted pasa una devolución de llamada (delegado) que se invoca cuando se completa el trabajo. Hay una propiedad para determinar si el método se ejecuta sincrónicamente.

+0

Muchas gracias – user160677

4

Con una devolución de llamada sincrónica, el método de llamada (o subproceso) tiene que esperar hasta que el método llamado se haya completado antes de continuar el procesamiento, al igual que una llamada a un método "normal".

Con una devolución de llamada asíncrona, el método de llamada (o subproceso) puede continuar procesando otras entradas o eventos o lo que sea sin esperar a que se complete el método llamado.

Para un subproceso de interfaz de usuario de aplicaciones si no desea que se "congele" mientras la aplicación está llevando a cabo un proceso largo, debe utilizar devoluciones de llamada asincrónicas.

+1

Gracias a Chris por su explicación – user160677

+0

No hay problema, hay mucho más que eso y sugiero leer más en MSDN y buscar aquí preguntas sobre multi-threading. – ChrisF

+0

Claro que iré a través de MSDN según lo sugerido. Muchísimas gracias – user160677

Cuestiones relacionadas