進行異步呼叫
進行同步呼叫的程序很簡單:用戶端會取得伺服器物件上的介面指標,並透過該指標呼叫方法。 異步呼叫牽涉到呼叫物件,因此需要再執行一些步驟。
針對同步介面上的每個方法,對應的異步介面會實作兩種方法。 這些方法會將前置詞Begin_和Finish_附加至同步方法的名稱。 例如,如果名為 ISimpleStream 的介面具有 Read 方法,則 AsyncISimpleStream 介面會有Begin_Read和Finish_Read方法。 若要開始異步呼叫,用戶端會呼叫 Begin_ 方法。
若要開始異步呼叫
查詢 ICallFactory 介面的伺服器物件。 如果 QueryInterface 傳回E_NOINTERFACE,則伺服器物件不支援異步呼叫。
呼叫 ICallFactory::CreateCall 來建立對應至所需介面的呼叫對象,然後釋放 ICallFactory 的指標。
如果您未從 CreateCall 呼叫要求異步介面的指標,請查詢異步介面的呼叫物件。
呼叫適當的Begin_方法。
伺服器物件現在正在處理異步呼叫,而且用戶端可以自由執行其他工作,直到需要呼叫的結果為止。
呼叫物件一次只能處理一個異步呼叫。 如果相同或第二個用戶端在暫止異步呼叫完成之前呼叫Begin_方法,則Begin_方法會傳回RPC_E_CALL_PENDING。
如果用戶端不需要Begin_方法的結果,則可以在此程序結尾釋放呼叫物件。 COM會偵測此條件並清除呼叫。 不會呼叫Finish_方法,而且用戶端不會取得任何 out 參數或傳回值。
當伺服器物件準備好從 Begin_ 方法傳回時,它會向呼叫對象發出已完成的訊號。 當用戶端就緒時,它會檢查呼叫物件是否已發出訊號。 如果是,用戶端可以完成異步呼叫。
用戶端和伺服器之間這個訊號和檢查的機制是 呼叫物件上的ISynchronize 介面。 呼叫物件通常會藉由匯總系統提供的同步處理對象來實作這個介面。 同步處理物件會包裝事件句柄,伺服器會在呼叫 ISynchronize::Signal 從 Begin_ 方法傳回之前發出訊號。
若要完成異步呼叫
查詢 ISynchronize 介面的呼叫物件。
如果 Wait 傳回RPC_E_TIMEOUT,則Begin_方法不會完成處理。 用戶端可以繼續進行其他工作,稍後再呼叫 Wait 。 除非 Wait 傳回S_OK,否則它無法呼叫 Finish_ 方法。
如果 Wait 傳回S_OK,則傳回Begin_方法。 呼叫適當的Finish_方法。
Finish_方法會傳遞用戶端任何 out 參數。 異步方法的行為,包括Finish_方法的傳回值,應該完全符合對應同步方法的行為。
用戶端可以在傳回Finish_方法時立即釋放呼叫物件,也可以保存呼叫物件的指標以進行其他呼叫。 不論是哪一種情況,用戶端都負責在不再需要物件時釋放呼叫物件。
如果您在未進行呼叫時呼叫Finish_方法,此方法會傳回RPC_E_CALL_COMPLETE。
注意
如果客戶端和伺服器對象位於相同的 Apartment 中,則不保證會成功呼叫 ICallFactory::CreateCall。 如果伺服器物件不支援特定介面上的異步呼叫,則嘗試建立呼叫物件將會失敗,而且客戶端必須使用同步介面。
相關主題