Tätigen eines asynchronen Aufrufs

Das Verfahren zum Ausführen eines synchronen Aufrufs ist einfach: Der Client ruft einen Schnittstellenzeiger auf das Serverobjekt ab und ruft Methoden über diesen Zeiger auf. Der asynchrone Aufruf umfasst ein Aufrufobjekt, daher sind einige weitere Schritte erforderlich.

Für jede Methode auf einer synchronen Schnittstelle implementiert die entsprechende asynchrone Schnittstelle zwei Methoden. Diese Methoden fügen die Präfixe Begin_ und Finish_ an den Namen der synchronen Methode an. Wenn beispielsweise eine Schnittstelle mit dem Namen ISimpleStream über eine Read-Methode verfügt, verfügt die AsyncISimpleStream-Schnittstelle über eine Begin_Read- und eine Finish_Read-Methode. Um einen asynchronen Aufruf zu starten, ruft der Client die Begin_-Methode auf.

So starten Sie einen asynchronen Aufruf

  1. Fragen Sie das Serverobjekt für die ICallFactory-Schnittstelle ab. Wenn QueryInterface E_NOINTERFACE zurückgibt, unterstützt das Serverobjekt keine asynchronen Aufrufe.

  2. Rufen Sie ICallFactory::CreateCall auf, um ein Aufrufobjekt zu erstellen, das der gewünschten Schnittstelle entspricht, und lassen Sie dann den Zeiger auf ICallFactory frei.

  3. Wenn Sie aus dem Aufruf von CreateCall keinen Zeiger auf die asynchrone Schnittstelle anfordern, fragen Sie das Aufrufobjekt für die asynchrone Schnittstelle ab.

  4. Rufen Sie die entsprechende Begin_-Methode auf.

Das Serverobjekt verarbeitet nun den asynchronen Aufruf, und der Client kann andere Arbeiten ausführen, bis er die Ergebnisse des Aufrufs benötigt.

Ein Aufrufobjekt kann jeweils nur einen asynchronen Aufruf verarbeiten. Wenn derselbe oder ein zweiter Client eine Begin_-Methode aufruft, bevor ein ausstehender asynchroner Aufruf abgeschlossen ist, gibt die Begin_-Methode RPC_E_CALL_PENDING zurück.

Wenn der Client die Ergebnisse der Begin_-Methode nicht benötigt, kann er das Aufrufobjekt am Ende dieser Prozedur freigeben. COM erkennt diese Bedingung und bereinigt den Aufruf. Die Finish_-Methode wird nicht aufgerufen, und der Client ruft keine Parameter oder einen Rückgabewert ab.

Wenn das Serverobjekt bereit ist, von der Begin_-Methode zurückzugeben, signalisiert es dem Aufrufobjekt, dass es abgeschlossen ist. Wenn der Client bereit ist, überprüft er, ob das Aufrufobjekt signalisiert wurde. Wenn ja, kann der Client den asynchronen Aufruf abschließen.

Der Mechanismus für diese Signalisierung und Überprüfung zwischen Client und Server ist die ISynchronize-Schnittstelle für das Aufrufobjekt. Das Aufrufobjekt implementiert diese Schnittstelle normalerweise durch Aggregieren eines vom System bereitgestellten Synchronisierungsobjekts. Das Synchronisierungsobjekt umschließt ein Ereignishandle, das der Server unmittelbar vor der Rückgabe von der Begin_-Methode signalisiert, indem ISynchronize::Signal aufgerufen wird.

So schließen Sie einen asynchronen Aufruf ab

  1. Fragen Sie das Aufrufobjekt für die ISynchronize-Schnittstelle ab.

  2. Rufen Sie ISynchronize::Wait auf.

  3. Wenn Wait RPC_E_TIMEOUT zurückgibt, ist die Begin_-Methode nicht abgeschlossen. Der Client kann mit anderen Arbeiten fortfahren und später erneut Warten aufrufen. Die Finish_-Methode kann erst aufgerufen werden, wenn Wait S_OK zurückgibt.

    Wenn Wait S_OK zurückgibt, wurde die Begin_-Methode zurückgegeben. Rufen Sie die entsprechende Finish_-Methode auf.

Die Finish_-Methode übergibt dem Client beliebige Parameter. Das Verhalten der asynchronen Methoden, einschließlich des Rückgabewerts der Finish_-Methode, sollte genau mit dem der entsprechenden synchronen Methode übereinstimmen.

Der Client kann das Aufrufobjekt freigeben, sobald die Finish_-Methode zurückgibt, oder er kann einen Zeiger auf das Aufrufobjekt enthalten, um zusätzliche Aufrufe auszuführen. In beiden Fällen ist der Client für die Freigabe des Aufrufobjekts verantwortlich, wenn das Objekt nicht mehr benötigt wird.

Wenn Sie eine Finish_-Methode aufrufen, wenn kein Aufruf ausgeführt wird, gibt die Methode RPC_E_CALL_COMPLETE zurück.

Hinweis

Wenn sich die Client- und Serverobjekte im selben Apartment befinden, ist der Erfolg von Aufrufen von ICallFactory::CreateCall nicht garantiert. Wenn das Serverobjekt den asynchronen Aufruf für eine bestimmte Schnittstelle nicht unterstützt, schlägt der Versuch, ein Aufrufobjekt zu erstellen, fehl, und der Client muss die synchrone Schnittstelle verwenden.

 

Abbrechen eines asynchronen Anrufs

Clientsicherheit während eines asynchronen Anrufs

Identitätswechsel und asynchrone Aufrufe