Condividi tramite


Elaborazione asincrona dei messaggi

Aggiornamento: novembre 2007

Se si desidera recuperare i messaggi senza bloccare l'elaborazione dell'applicazione, sarà possibile recuperare i messaggi in modalità asincrona. Nell'elaborazione asincrona dei messaggi il metodo con cui viene avviata un'operazione viene terminato immediatamente senza attendere la restituzione di un risultato. Mentre l'operazione viene completata, l'applicazione consente di continuare a effettuare le operazioni già in esecuzione in precedenza. Al termine, il server è in grado di notificare all'applicazione il completamento dell’elaborazione del messaggio.

Esistono due tipi di operazioni asincrone di messaggistica: la ricezione e la lettura asincrone dei messaggi. Quando si recupera un messaggio in modo asincrono, si utilizzano i metodi BeginReceive e EndReceive per contrassegnare l'inizio e la fine dell'operazione. Di seguito sono riportate le operazioni effettuate.

  • Il metodo BeginReceive effettua immediatamente la restituzione e genera un evento ReceiveCompleted quando un messaggio viene reso disponibile nella coda o se il messaggio letto o ricevuto è già esistente.

  • L'evento ReceiveCompleted restituisce un oggetto di tipo IAsyncResult contenente informazioni sull'operazione asincrona.

  • Una volta ricevuto l'evento completato, chiamare il metodo EndReceive per completare l'operazione. Durante la chiamata di chiusura è possibile accedere al messaggio o recuperarlo accedendo alla classe ReceiveCompletedEventArgs.

Sebbene sia possibile accedere all'oggetto IAsyncResult per l'intera durata dell'operazione, tale oggetto viene utilizzato in genere solo al momento della chiamata al metodo EndReceive. Se si avviano tuttavia diverse operazioni asincrone, è possibile inserire i relativi valori IAsyncResult in una matrice e specificare se si desidera attendere il completamento di una o di tutte le operazioni. In tal caso, per identificare le operazioni completate, si utilizza la proprietà AsyncWaitHandle dell'oggetto IAsyncResult.

Il metodo Peek, in modo analogo al metodo Receive, utilizza due metodi denominati BeginPeek eEndPeek per contrassegnare l'inizio e la fine dell'operazione asincrona. Il metodo BeginPeek effettua immediatamente la restituzione e genera un evento denominato PeekCompleted quando un messaggio viene reso disponibile. In modo analogo a ReceiveCompleted, questo evento restituisce un oggetto IAsyncResult che è possibile utilizzare per ottenere informazioni sull'operazione.

Inoltre, per le operazioni di visualizzazione e ricezione asincrone può essere utilizzato un periodo di timeout per specificare l'intervallo di attesa affinché un messaggio diventi disponibile. A tale scopo, è necessario utilizzare una forma di overload di uno dei due metodi per passare un oggetto TimeSpan che indica il tempo di attesa. Se il periodo di timeout scade, viene generato l'evento ReceiveCompleted o PeekCompleted, ma la proprietà IsCompleted dell'oggetto IAsyncResult viene impostata su false per indicare che un messaggio non è stato gestito.

Per ulteriori informazioni sull'elaborazione asincrona, vedere le seguenti pagine:

Per

Vedere

Istruzioni dettagliate sulla ricezione asincrona di un messaggio

Procedura: ricevere messaggi in modo asincrono

Una panoramica del metodo BeginPeek e dei relativi membri

BeginPeek

Una panoramica del metodo BeginReceive e dei relativi membri

BeginReceive

Ricezione della notifica dell'operazione asincrona

Quando l'operazione di visualizzazione o ricezione viene completata, è possibile ricevere la notifica in due modi:

  • È possibile creare un gestore eventi da utilizzare quando si verifica l'evento ReceiveCompleted o PeekCompleted.

  • È possibile utilizzare un callback per esaminare automaticamente i messaggi in arrivo e passare l'elaborazione all'applicazione all'arrivo di un messaggio.

Quando si utilizza la notifica degli eventi, si crea un metodo per la gestione dell'elaborazione dei messaggi, che restituisce una notifica al termine dell'elaborazione. Viene quindi richiamato il metodo con cui viene avviata l'elaborazione asincrona. Nel sistema vengono creati automaticamente i gestori eventi quando si fa doppio clic sul componente MessageQueue nella finestra di progettazione.

Nota:

Nello scenario della notifica degli eventi, il metodo BeginPeek o BeginReceive restituisce un solo messaggio, quindi l'elaborazione viene interrotta. È necessario chiamare di nuovo il metodo BeginPeek o BeginReceive per ciascun messaggio che si desidera recuperare.

Un metodo alternativo per l'elaborazione asincrona dei messaggi consiste nell'utilizzo di un callback. Un callback identifica un delegato che si desidera associare all'operazione BeginPeek o BeginReceive. In questo scenario, il delegato continua a controllare la notifica di nuovi eventi dopo che ciascun messaggio è stato elaborato.

Vedere anche

Attività

Procedura: ricevere messaggi in modo asincrono

Procedura: visualizzare i messaggi

Procedura: ricevere messaggi a livello di codice

Altre risorse

Lettura e ricezione di messaggi