進行和處理非同步呼叫

COM 物件可以支援非同步呼叫。 當用戶端進行非同步呼叫時,控制項會立即返回用戶端。 當伺服器處理呼叫時,用戶端可以執行其他工作。 當用戶端在呼叫結果沒有結果的情況下無法再繼續時,它可以取得該呼叫的結果。

例如,大型或複雜記錄集的要求可能相當耗時。 用戶端可以透過非同步呼叫要求記錄集,然後執行其他工作。 當記錄集可供使用時,用戶端可以在不封鎖的情況下快速取得記錄集。

用戶端不會直接在伺服器物件上進行非同步呼叫。 相反地,他們會取得呼叫物件,該物件會在伺服器物件上實作同步介面的非同步版本。 呼叫物件上的非同步介面具有AsyncInterfaceName格式的名稱。 例如,如果伺服器物件實作名為 IMyInterface 的同步介面,則會有一個呼叫物件實作名為 AsyncIMyInterface 的非同步介面。

注意

IDispatch 或繼承IDispatch的介面無法使用非同步支援。

 

支援非同步呼叫的伺服器物件會實作 ICallFactory 介面。 這個介面會公開單一方法 CreateCall,這個方法會建立指定之呼叫物件的實例。 用戶端可以查詢 ICallFactory ,以判斷物件是否支援非同步呼叫。

針對同步介面上的每個方法,對應的非同步介面會實作兩種方法。 這些方法會將前置詞Begin_並Finish_附加至同步方法的名稱。 例如,如果名為 ISimpleStream 的介面具有 Read 方法,則 AsyncISimpleStream 介面會有Begin_Read和Finish_Read方法。 若要開始非同步呼叫,用戶端會呼叫 Begin_ 方法。

當您實作伺服器物件時,您不需要為物件實作的每個介面提供呼叫物件。 如果伺服器物件實作 ICallFactory 介面並使用標準封送處理,則封送處理用戶端一律可以取得 Proxy 呼叫物件,即使伺服器端沒有呼叫物件也一樣。 此 Proxy 會將Begin_方法封送處理為同步呼叫,伺服器會以同步方式處理呼叫,而用戶端可以呼叫 Finish_ 方法來取得 out 參數。

相反地,如果用戶端在伺服器端有呼叫物件的介面上進行封送處理同步呼叫,伺服器一律會以非同步方式處理呼叫。 用戶端不會顯示此行為,因為用戶端會收到相同的 out 參數,以及它從同步方法收到的相同傳回值。

不論是哪一種情況,用戶端與伺服器之間的互動會封送處理為同步:同步和非同步 Proxy 的輸出是不可區分的,如同對應存根的輸出一樣。 此行為可大幅簡化用戶端和伺服器的程式設計模型。 如果伺服器物件實作 ICallFactory,則封送處理用戶端不需要嘗試建立可能無法使用的呼叫物件,用戶端永遠可以使用呼叫物件。

當用戶端和伺服器位於相同的 Apartment 中時,伺服器物件將會處理用戶端進行呼叫。 如果呼叫物件無法使用,用戶端必須明確取得同步介面並進行同步呼叫。

如需詳細資訊,請參閱下列主題: