Abbrechen von Methodenaufrufen

Mit der Einführung verteilter und webbasierter Anwendungen können einige Methodenaufrufe eine inakzeptable Lange dauern, bis sie zurückgegeben werden. Die Latenz der Netzwerkverbindung kann hoch sein, der Servercomputer kann viele Clients bedienen, oder die Serverkomponente übergibt möglicherweise eine große Menge an Daten, z. B. eine Multimediadatei. Benutzer sollten in der Lage sein, eine Anforderung abzubrechen, die zu lange dauert, und die Anwendung sollte in der Lage sein, Abbruchanforderungen zu verarbeiten und mit ihren anderen Arbeiten fortzufahren. In COM können Sie die IMessageFilter-Schnittstelle verwenden, um einen ausstehenden Aufruf abzubrechen, der aus einem Singlethread-Apartment stammt.

Wenn ein Aufruf gemarst wird, erstellt der Proxy ein Cancel-Objekt, das die ICancelMethodCalls-Schnittstelle implementiert. Das Cancel-Objekt ist sowohl dem Aufruf als auch dem Thread zugeordnet, für den der Aufruf aussteht.

Um den ausstehenden Aufruf abzubrechen, übergibt der Client eine Abbruchanforderung über das Cancel-Objekt, das die Details der Benachrichtigung des Serverobjekts verarbeitet, dass der Aufruf abgebrochen wurde. Wenn die aufgerufene Methode nicht zurückgegeben wurde, bereinigt das Serverobjekt beim Erkennen der Abbruchanforderung alle programmseitig zugewiesenen Programmressourcen und benachrichtigt den Client, indem es einen entsprechenden HRESULT-Wert zurückgibt, dass es die Ausführung des Aufrufs abgebrochen hat. Wenn die aufgerufene Methode bereits zurückgegeben wurde, benachrichtigt das Cancel-Objekt den Client. In beiden Fällen wird der Clientthread aufgehoben und kann die Verarbeitung fortsetzen.

Wie das Serverobjekt auf eine Abbruchanforderung reagiert, liegt im Ermessen des Serverimplementierers, aber der aufrufende Thread auf dem Client wird immer aufgehoben und ignoriert alle Ergebnisse, die der Server an ihn übergeben möchte. Cancel-Objekte bieten eine Möglichkeit, um anzufordern, dass eine derzeit ausgeführte Methode abgebrochen wird. Es gibt jedoch keine Garantie, dass das Serverobjekt die Verarbeitung des Aufrufs beendet. Beispielsweise kann der Aufruf bereits zurückgegeben worden sein, oder das Serverobjekt unterstützt keine Abbruchobjekte.

COM stellt automatisch eine Standardimplementierung von Abbruchobjekten für Clientobjekte und Schnittstellen bereit, die Standard-Marshalling verwenden. Für Objekte und Schnittstellen, die benutzerdefiniertes Marshalling verwenden, müssen Sie Ein eigenes Abbruchobjekt implementieren.

Zu diesem Zeitpunkt behandeln Abbruchobjekte nur synchrone Aufrufe.

Abbrechen eines asynchronen Anrufs

CoGetCancelObject

CoSetCancelObject

CoTestCancel