取消方法呼叫

隨著分散式和 Web 型應用程式的引進,某些方法呼叫可能需要很長的時間才能傳回。 網路連線的延遲可能很高、伺服器計算機可能為許多用戶端提供服務,或伺服器元件可能會傳遞大量數據,例如多媒體檔案。 用戶應該能夠取消花費太多時間的要求,而且應用程式應該能夠處理取消要求,並繼續執行其他工作。 在 COM 中 ,您可以使用 IMessageFilter 介面來取消來自單個線程 Apartment 的擱置呼叫。

封送處理呼叫時,Proxy 會建立 cancel 物件,以實作 ICancelMethodCalls 介面。 cancel 對象與呼叫擱置所在的呼叫和線程相關聯。

若要取消暫止呼叫,用戶端會透過 cancel 物件傳遞取消要求,以處理通知伺服器物件已取消呼叫的詳細數據。 如果呼叫的方法尚未傳回,伺服器對象在偵測取消要求時,會藉由傳回適當的 HRESULT 值來清除它已配置並通知其用戶端的任何程式資源,以取消呼叫的執行。 如果呼叫的方法已經傳回,cancel 物件會通知用戶端。 不論是哪一種情況,用戶端線程都已解除封鎖,而且可以繼續處理。

伺服器物件對取消要求的回應方式是伺服器實作者自行決定的,但用戶端上的呼叫線程一律會解除封鎖,並且會忽略伺服器嘗試傳遞給它的任何結果。 Cancel 物件提供方法來要求目前執行中的方法已取消,但不保證伺服器物件會停止處理呼叫。 例如,呼叫可能已經傳回,或伺服器物件可能不支援取消物件。

COM 會自動為使用標準封送處理之用戶端物件和介面提供取消對象的標準實作。 針對使用自定義封送處理的物件和介面,您必須實作自己的取消物件。

此時,取消物件只會處理同步呼叫。

取消異步呼叫

CoGetCancelObject

CoSetCancelObject

CoTestCancel