Abbrechen von Methodenaufrufen

Mit der Einführung verteilter und webbasierter Anwendungen kann die Rückgabe einiger Methodenaufrufe inakzeptabel lange dauern. Die Latenz der Netzwerkverbindung kann hoch sein, der Servercomputer kann viele Clients bedienen, oder die Serverkomponente überträgt möglicherweise eine große Menge an Daten, z. B. eine Multimediadatei. Benutzer sollten in der Lage sein, eine Anforderung abzubruchen, die zu lange dauern, und die Anwendung sollte In der Lage sein, Abbruchanforderungen zu verarbeiten und die anderen Arbeiten fortzufahren. In COM können Sie die IMessageFilter-Schnittstelle verwenden, um einen ausstehenden Aufruf abzubricht, der aus einem Singlethread-Apartment stammt.

Wenn ein Aufruf gemarshallt 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 abzubruchen, übergibt der Client eine Abbruchanforderung über das Cancel-Objekt, das die Details zur Benachrichtigung des Serverobjekts verarbeitet, dass der Aufruf abgebrochen wurde. Wenn die aufgerufene Methode nicht zurückgegeben hat, bereinigt das Serverobjekt bei der Erkennung der Abbruchanforderung alle zugeordneten Programmressourcen und benachrichtigt seinen Client, indem es einen entsprechenden HRESULT-Wert zurückgibt, dass die Ausführung des Aufrufs abgebrochen wurde. Wenn die aufgerufene Methode bereits zurückgegeben hat, benachrichtigt das Cancel-Objekt den Client. In beiden Fällen wird die Blockierung des Clientthreads aufgehoben, und die Verarbeitung kann fortgesetzt werden.

Wie das Serverobjekt auf eine Abbruchanforderung reagiert, liegt im Ermessen des Server implementers. Der aufrufende Thread auf dem Client wird jedoch immer entsperrt und ignoriert alle Ergebnisse, die der Server an ihn zu übergeben versucht. Cancel-Objekte stellen eine Möglichkeit dar, um anzuhalten, dass eine derzeit ausgeführte Methode abgebrochen wird. Es gibt jedoch keine Garantie, dass das Serverobjekt die Verarbeitung des Aufrufs beenden wird. Beispielsweise kann der Aufruf bereits zurückgegeben worden sein, oder das Serverobjekt unterstützt cancel-Objekte möglicherweise nicht.

COM stellt automatisch eine Standardimplementierung von Cancel-Objekten für Clientobjekte und Schnittstellen bereit, die standardmäßiges Marshalling verwenden. Für Objekte und Schnittstellen, die benutzerdefiniertes Marshalling verwenden, müssen Sie Ihr eigenes Cancel-Objekt implementieren.

Derzeit verarbeiten Cancel-Objekte nur synchrone Aufrufe.

Abbrechen eines asynchronen Aufrufs

CoGetCancelObject

CoSetCancelObject

CoTestCancel