Tätigen und Verarbeiten asynchroner Aufrufe

COM-Objekte können asynchrone Aufrufe unterstützen. Wenn ein Client einen asynchronen Aufruf vornimmt, kehrt das Steuerelement sofort zum Client zurück. Während der Server den Aufruf verarbeitet, ist der Client frei, andere Arbeiten durchzuführen. Wenn der Client ohne die Ergebnisse des Anrufs nicht mehr fortfahren kann, kann er die Ergebnisse des Anrufs zu diesem Zeitpunkt abrufen.

Beispielsweise kann eine Anforderung für ein großes oder komplexes Recordset zeitaufwendig sein. Ein Client kann das Recordset durch einen asynchronen Aufruf anfordern und dann andere Arbeiten ausführen. Wenn das Recordset verfügbar ist, kann der Client es schnell abrufen, ohne es zu blockieren.

Clients tätigen keine asynchronen Aufrufe direkt auf dem Serverobjekt. Stattdessen wird ein Aufrufobjekt abgerufen, das eine asynchrone Version einer synchronen Schnittstelle auf dem Serverobjekt implementiert. Die asynchrone Schnittstelle des Aufrufobjekts weist einen Namen des Formulars AsyncInterfaceName auf. Wenn beispielsweise ein Serverobjekt eine synchrone Schnittstelle namens IMyInterface implementiert, gibt es ein Aufrufobjekt, das eine asynchrone Schnittstelle namens AsyncIMyInterface implementiert.

Hinweis

Asynchrone Unterstützung ist für IDispatch oder für Schnittstellen, die IDispatch erben, nicht verfügbar.

 

Serverobjekte, die asynchrone Aufrufe unterstützen, implementieren die ICallFactory-Schnittstelle . Diese Schnittstelle macht eine einzelne Methode , CreateCall, verfügbar, die eine Instanz eines angegebenen Aufrufobjekts erstellt. Clients können nach ICallFactory abfragen, um zu ermitteln, ob ein Objekt asynchrone Aufrufe unterstützt.

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_ dem Namen der synchronen Methode an. Wenn beispielsweise eine Schnittstelle mit dem Namen ISimpleStream eine Read-Methode aufweist, 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.

Wenn Sie ein Serverobjekt implementieren, müssen Sie kein Aufrufobjekt für jede Schnittstelle bereitstellen, die das Objekt implementiert. Wenn das Serverobjekt die ICallFactory-Schnittstelle implementiert und standardmäßiges Marshaling verwendet, kann ein Marshaled-Client immer ein Proxyaufrufobjekt abrufen, auch wenn kein Aufrufobjekt auf der Serverseite vorhanden ist. Dieser Proxy führt die Begin_-Methode als synchronen Aufruf durch, der Server verarbeitet den Aufruf synchron, und der Client kann die Out-Parameter abrufen, indem die Finish_-Methode aufgerufen wird.

Wenn ein Client dagegen einen marshalierten synchronen Aufruf an einer Schnittstelle vornimmt, für die ein Aufrufobjekt auf der Serverseite vorhanden ist, verarbeitet der Server den Aufruf immer asynchron. Dieses Verhalten wird dem Client nicht angezeigt, da der Client dieselben Parameter empfängt und denselben Rückgabewert erhält, den er von der synchronen Methode erhalten hätte.

In beiden Fällen wird die Interaktion zwischen Client und Server gemarstet, als ob der Aufruf synchron war: Die Ausgabe synchroner und asynchroner Proxys ist unveränderlich, wie die Ausgabe der entsprechenden Stubs. Dieses Verhalten vereinfacht das Programmiermodell sowohl von Clients als auch von Servern erheblich. Wenn ein Serverobjekt ICallFactory implementiert, muss ein Marshaled-Client nicht versuchen, ein Aufrufobjekt zu erstellen, das möglicherweise nicht verfügbar ist – für den Client ist ein Aufrufobjekt immer verfügbar.

Wenn sich Client und Server in derselben Wohnung befinden, verarbeitet das Serverobjekt, welcher Aufruf des Clients ausgeführt wird. Wenn ein Aufrufobjekt nicht verfügbar ist, muss der Client explizit die synchrone Schnittstelle abrufen und einen synchronen Aufruf tätigen.

Weitere Informationen finden Sie in den folgenden Themen: