Tätigen und Verarbeiten asynchroner Aufrufe

COM-Objekte können asynchrone Aufrufe unterstützen. Wenn ein Client einen asynchronen Aufruf ausgibt, kehrt das Steuerelement sofort an den Client zurück. Während der Server den Aufruf verarbeitet, kann der Client andere Aufgaben ausführen. Wenn der Client ohne die Ergebnisse des Aufrufs nicht mehr fortfahren kann, kann er die Ergebnisse des Aufrufs zu diesem Zeitpunkt abrufen.

Beispielsweise kann eine Anforderung für ein großes oder komplexes Recordset zeitaufwändig sein. Ein Client kann das Recordset durch einen asynchronen Aufruf anfordern und dann andere Aufgaben ausführen. Wenn das Recordset verfügbar ist, kann es vom Client schnell abgerufen werden, ohne es zu blockieren.

Clients tätigen keine asynchronen Aufrufe direkt auf dem Serverobjekt. Stattdessen erhalten sie ein Aufrufobjekt, das eine asynchrone Version einer synchronen Schnittstelle auf dem Serverobjekt implementiert. Die asynchrone Schnittstelle für das Aufrufobjekt hat den Namen AsyncInterfaceName. Wenn beispielsweise ein Serverobjekt eine synchrone Schnittstelle namens IMyInterface implementiert, gibt es ein Aufrufobjekt, das eine asynchrone Schnittstelle mit dem Namen AsyncIMyInterface implementiert.

Hinweis

Für IDispatch oder Schnittstellen, die IDispatch erben, ist keine asynchrone Unterstützung verfügbar.

 

Serverobjekte, die asynchrone Aufrufe unterstützen, implementieren die ICallFactory-Schnittstelle . Diese Schnittstelle macht eine einzelne Methode verfügbar, CreateCall, die eine instance eines angegebenen Aufrufobjekts erstellt. Clients können ICallFactory abfragen, um zu bestimmen, 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_ 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.

Wenn Sie ein Serverobjekt implementieren, müssen Sie nicht für jede Vom Objekt implementierte Schnittstelle ein Aufrufobjekt bereitstellen. Wenn das Serverobjekt die ICallFactory-Schnittstelle implementiert und das Standard marshaling verwendet, kann ein gemarster Client immer ein Proxyaufrufobjekt abrufen, auch wenn auf der Serverseite kein Aufrufobjekt vorhanden ist. Dieser Proxy marshallt die Begin_-Methode als synchronen Aufruf, der Server verarbeitet den Aufruf synchron, und der Client kann die out-Parameter abrufen, indem er die Finish_-Methode aufruft.

Wenn ein Client hingegen einen gemarsten synchronen Aufruf für eine Schnittstelle ausgibt, für die auf der Serverseite ein Aufrufobjekt vorhanden ist, verarbeitet der Server den Aufruf immer asynchron. Dieses Verhalten ist für den Client nicht erkennbar, da der Client die gleichen Out-Parameter und den gleichen Rückgabewert erhält, den er von der synchronen Methode erhalten hätte.

In beiden Fällen wird die Interaktion zwischen Client und Server gemarst, als wäre der Aufruf synchron: Die Ausgabe synchroner und asynchroner Proxys ist nicht zu unterscheiden, ebenso 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 gemarster 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 im selben Apartment befinden, verarbeitet das Serverobjekt den Aufruf des Clients. Wenn ein Aufrufobjekt nicht verfügbar ist, muss der Client explizit die synchrone Schnittstelle abrufen und einen synchronen Aufruf ausführen.

Weitere Informationen finden Sie in den folgenden Themen: