Procesamiento asincrónico de mensajes
Actualización: noviembre 2007
Puede recuperar mensajes de forma asincrónica si desea que esta acción no condicione el procesamiento de la aplicación. En el procesamiento asincrónico de mensajes, el método que inicia una tarea es devuelto inmediatamente sin esperar a los resultados. La aplicación puede continuar haciendo lo que estaba realizando originalmente mientras se completa la tarea. Una vez completada la tarea, el servidor puede notificar a la aplicación que el mensaje se ha procesado correctamente.
Hay dos tipos de operaciones asincrónicas de mensajería: la recepción asincrónica de mensajes y la ejecución asincrónica del método Peek en los mensajes. Cuando recupere un mensaje de forma asincrónica, utilice los métodos BeginReceive y EndReceive para marcar el principio y el final de la operación. Las acciones se producen de la forma siguiente:
El método BeginReceive es devuelto inmediatamente y desencadena un evento denominado ReceiveCompleted cuando hay un mensaje disponible en la cola, o si el mensaje que se recibe o en el que se ejecuta el método Peek ya existe.
El evento ReceiveCompleted devuelve un objeto de tipo IAsyncResult que contiene información sobre la operación asincrónica.
Una vez recibido el evento completado, se llama al método EndReceive para finalizar la operación. Dentro de la llamada final, se puede tener acceso al mensaje o recuperarlo a través de la clase ReceiveCompletedEventArgs.
Puede tener acceso al objeto IAsyncResult durante la operación, aunque lo normal será que no lo utilice hasta que se llame a EndReceive. No obstante, si inicia varias operaciones asincrónicas, puede guardar sus valores IAsyncResult en una matriz y especificar si desea esperar a que se completen todas las operaciones o una operación individual. En este caso, utilice la propiedad AsyncWaitHandle del objeto IAsyncResult para identificar las operaciones finalizadas.
Peek, al igual que Receive, utiliza dos métodos denominados BeginPeek y EndPeek para indicar el inicio y el final de la operación asincrónica. BeginPeek es devuelto inmediatamente y desencadena un evento denominado PeekCompleted cuando un mensaje pasa a estar disponible. Al igual que ReceiveCompleted, este evento devuelve un objeto IAsyncResult que se puede manipular para obtener información sobre la operación.
Además, ambas operaciones asincrónicas, recepción y ejecución del método Peek, pueden utilizar un periodo de tiempo de espera para especificar el tiempo que se desea esperar a que un mensaje esté disponible. Para ello, utilice una forma sobrecargada de cualquiera de los métodos para transferir un objeto TimeSpan que indique el tiempo que se debe esperar. El evento ReceiveCompleted o PeekCompleted se desencadena si transcurre el período de tiempo de espera, pero la propiedad IsCompleted del objeto IAsyncResult se establece en false para indicar que no se ha procesado un mensaje.
Para obtener más información sobre el procesamiento asincrónico, vea las páginas siguientes:
Para |
Vea |
---|---|
Obtener instrucciones paso a paso sobre la recepción de un mensaje de forma asincrónica |
|
Obtener información general sobre el método BeginPeek y sus miembros |
|
Obtener información general sobre el método BeginReceive y sus miembros |
Recibir notificaciones de las operaciones asincrónicas
Hay dos formas de recibir una notificación cuando una operación asincrónica de recepción o de ejecución del método Peek se completa correctamente:
Puede crear un controlador de eventos que controle los eventos ReceiveCompleted o PeekCompleted cuando éstos se desencadenen.
Puede utilizar un elemento de devolución de llamada para que inspeccione automáticamente los mensajes entrantes y pase el procesamiento a la aplicación cuando llegue un mensaje.
Cuando utilice la notificación de eventos, cree un método que controle el procesamiento del mensaje y devuelva una notificación cuando finalice el procesamiento. A continuación, llame al método que inicia el procesamiento asincrónico. El sistema creará automáticamente los controladores de eventos cuando haga doble clic en el componente MessageQueue desde el diseñador.
Nota: |
---|
En el escenario de la notificación de eventos, BeginPeek o BeginReceive devuelven un único mensaje y detienen el procesamiento. Deberá llamar de nuevo a BeginPeek o BeginReceive para cada mensaje que desee recuperar. |
Un medio alternativo para procesar mensajes de forma asincrónica es utilizar una devolución de llamada. Una devolución de llamada identifica un delegado que se desea asociar a las operaciones BeginPeek o BeginReceive. En este escenario, el delegado continúa inspeccionando notificaciones nuevas de eventos después de procesar cada mensaje.
Vea también
Tareas
Cómo: Recibir mensajes de forma asincrónica
Cómo: Ejecutar el método Peek en los mensajes
Cómo: Recibir mensajes mediante programación