進行和處理異步呼叫

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 參數,以及它從同步方法收到的相同傳回值。

在任一情況下,客戶端與伺服器之間的互動會封送處理為同步呼叫:同步和異步 Proxy 的輸出與對應的存根輸出相同。 此行為可大幅簡化客戶端和伺服器的程式設計模型。 如果伺服器物件實作 ICallFactory,封送處理用戶端就不需要嘗試建立可能無法使用的呼叫物件, 用戶端一律可以使用呼叫物件。

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

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