Asynchrone Meldungsverarbeitung
Aktualisiert: November 2007
Sie können Meldungen asynchron abrufen, wenn Sie die Verarbeitung der Anwendung dabei nicht blockieren möchten. Bei der asynchronen Meldungsverarbeitung wird die Methode, die eine Aufgabe startet, sofort zurückgegeben, ohne auf ein Ergebnis zu warten. Die Anwendung kann die ursprüngliche Aufgabe fortsetzen, während die Aufgabe ausgeführt wird. Nach Abschluss der Aufgabe kann der Server die Anwendung informieren, dass die Meldung erfolgreich verarbeitet wurde.
Es gibt zwei Arten von asynchronen Messaging-Operationen – der asynchrone Empfang von Meldungen und das asynchrone Einsehen (Peeking) von Meldungen. Beim asynchronen Abrufen einer Meldung kennzeichnen Sie den Anfang und das Ende der Operation mit der BeginReceive-Methode und mit der EndReceive-Methode. Es werden folgende Aktionen ausgeführt:
Die BeginReceive-Methode wird sofort beendet und löst ein Ereignis mit dem Namen ReceiveCompleted aus, wenn eine Meldung in der Warteschlange verfügbar wird oder die eingesehene bzw. empfangene Meldung bereits vorhanden ist.
Das ReceiveCompleted-Ereignis gibt ein Objekt vom Typ IAsyncResult mit Informationen über die asynchrone Operation zurück.
Nachdem das beendete Ereignis empfangen wurde, rufen Sie die EndReceive-Methode auf, um die Operation zu beenden. Innerhalb des Endaufrufs können Sie auf die Meldung zugreifen oder diese abrufen, indem Sie auf die ReceiveCompletedEventArgs-Klasse zugreifen.
Sie können zwar während der gesamten Lebensdauer der Operation auf das IAsyncResult-Objekt zugreifen, in der Regel wird es jedoch erst beim Aufrufen von EndReceive verwendet. Wenn Sie jedoch mehrere asynchrone Operationen starten, können Sie deren IAsyncResult-Werte in ein Array stellen und angeben, ob so lange gewartet werden soll, bis alle oder nur einzelne Operationen beendet wurden. In diesem Fall müssen Sie mit der AsyncWaitHandle-Eigenschaft des IAsyncResult-Objekts das abgeschlossene Operationen bezeichnen.
Peek kennzeichnet ebenso wie Receive mithilfe von zwei Methoden (BeginPeek und EndPeek) den Beginn und das Ende der asynchronen Operation. BeginPeek wird sofort beendet und löst ein Ereignis mit dem Namen PeekCompleted aus, wenn eine Meldung verfügbar wird. Ebenso wie ReceiveCompleted gibt dieses Ereignis ein IAsyncResult-Objekt zurück, das Sie bearbeiten können, um Informationen über die Operation zu erhalten.
Die asynchrone Empfangs- und die asynchrone Peekoperation können mit einem Timeoutintervall außerdem angeben, wie lange auf eine Meldung gewartet werden soll. Dazu müssen Sie ein TimeSpan-Objekt, das die Wartezeit angibt, mithilfe einer überladenen Form einer der Methoden übergeben. Das ReceiveCompleted-Ereignis oder das PeekCompleted-Ereignis wird ausgelöst, wenn das Timeoutintervall abläuft. Die IsCompleted-Eigenschaft des IAsyncResult-Objekts wird jedoch auf false festgelegt und gibt damit an, dass eine Meldung nicht verarbeitet wurde.
Weitere Informationen über die asynchrone Verarbeitung finden Sie auf den folgenden Seiten:
Verwendungszweck |
Thema |
---|---|
Schritt-für-Schritt-Anweisungen zum asynchronen Empfang einer Meldung |
|
Übersicht über die BeginPeek-Methode und ihre Member |
|
Übersicht über die BeginReceive-Methode und ihre Member |
Empfangen einer Benachrichtigung der asynchronen Operation
Wenn eine asynchrone Empfangs- oder Peekoperation erfolgreich ausgeführt wurde, können Sie auf zwei Arten benachrichtigt werden:
Sie können einen Ereignishandler erstellen, der das ReceiveCompleted-Ereignis oder das PeekCompleted-Ereignis behandelt, wenn diese auftreten.
Die Warteschlange können Sie über einen Rückruf automatisch auf eingehende Meldungen hin überwachen und die Verarbeitung an die Anwendung übergeben, wenn eine Meldung empfangen wird.
Wenn Sie die Ereignisbenachrichtigung verwenden, erstellen Sie eine Methode, die die Meldungsverarbeitung handhabt und nach Abschluss der Verarbeitung eine Benachrichtigung zurückgibt. Anschließend rufen Sie die Methode auf, die die asynchrone Verarbeitung startet. Das System erstellt die Ereignishandler automatisch, wenn Sie im Designer auf die MessageQueue-Komponente doppelklicken.
Hinweis: |
---|
Im Ereignisbenachrichtigungsszenario gibt BeginPeek oder BeginReceive eine einzelne Meldung zurück und beendet dann die Verarbeitung. Sie müssen BeginPeek oder BeginReceive für jede abzurufende Meldung erneut aufrufen. |
Eine Alternative zur asynchronen Verarbeitung von Meldungen besteht in der Verwendung eines Rückrufs. Ein Rückruf identifiziert einen Delegaten, der der BeginPeek-Operation oder der BeginReceive-Operation zugeordnet wird. In diesem Szenario überwacht der Delegat die Warteschlange weiterhin auf neue Ereignisbenachrichtigungen, nachdem die Meldungen bearbeitet wurden.
Siehe auch
Aufgaben
Gewusst wie: Asynchrones Empfangen von Meldungen
Gewusst wie: Einsehen von Meldungen
Gewusst wie: Programmgesteuertes Empfangen von Meldungen