共用方式為


進行和處理異步呼叫

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

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

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

注意

IDispatch 或者繼承 IDispatch的介面不支援異步操作。

 

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

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

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

相反地,如果用戶端在伺服器端擁有呼叫物件的介面上進行封送同步呼叫,伺服器將始終以異步方式處理該呼叫。 用戶端看不出這種行為,因為它會收到相同的輸出參數和從同步方法收到的相同返回值。

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

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

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