c# - Devolución de llamada sincrónica y asincrónica
.net callback (3)
Me confunden algunos términos mientras leo documentos de MSDN y ejemplos de código.
¿Cuáles son las devoluciones de llamada en C #? En particular, ¿qué son las devoluciones de llamada sincrónicas y asincrónicas?
Por favor, explique esto desde el punto de vista de un profano.
Además, explique la interfaz IAsyncCallback IAsyncResult
. ¿Cómo podemos implementarlo? (con un ejemplo muy simple)
Gracias por adelantado.
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 para poder continuar con el proceso, al igual que una llamada a un método "ordinario".
Con una devolución de llamada asincrónica, 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 una secuencia de interfaz de usuario de aplicaciones, si no desea que se "congele" mientras la aplicación está realizando un proceso largo, debe utilizar devoluciones de llamada asincrónicas.
La interfaz IAsyncCallback
no existe, por lo que no puede implementarla.
Sospecho que en realidad quieres saber sobre la interfaz IAsyncResult
.
Recomiendo que lea esta página en MSDN.
La interfaz IAsyncResult
representa una operación (como una solicitud web o una llamada a la base de datos) que se ejecuta en segundo plano, mientras el código continúa ejecutándose. Puede decirle si la operación finalizó (la propiedad IsCompleted
). También le proporciona un objeto WaitHandle
(la propiedad AsyncWaitHandle
) que se puede usar para esperar hasta que finalice la operación. (Llamando a result.AsyncWaitHandle.WaitOne()
)
Obtiene un IAsyncResult
llamando a un método Begin
Whatever
. ( BeginExecuteReader
, BeginGetResponse
, y muchos otros). El método Begin
Whatever
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 suministra, que se llamará cuando la operación finalice. Generalmente se llamará a un hilo diferente, así que ten cuidado. Su método AsyncCallback recibirá el mismo resultado IAsyncResult que el método Begin
Whatever
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 quieras que sea, incluso null
)
Dentro de su AsyncCallback (o en cualquier otro lugar), puede llamar al método Whatever
que Whatever
que corresponda al método Begin
Whatever
que llamó en primer lugar. Tienes que darle el IAsyncResult desde Begin
Whatever
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á una WebResponse
). Si se produjo algún error durante la operación, End
Whatever
arrojará una excepción.
Implementaría IAsyncResult si desea crear su propia operación que pueda ejecutarse en segundo plano. También crearía Begin
Whatever
y End
Whatever
que Whatever
método que lo devuelva y lo tome, respectivamente. Para obtener más información sobre la implementación de IAsyncResult, consulte aquí .
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 llamadas Sync y Async son eso. Sincrónico, ejecute en el mismo hilo que llamó al método (comenzó la acción). Async generalmente se ejecutan 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.