電話語音的互動本質需要TAPI成為即時作業環境。 許多 TAPI 函式都需要快速完成,並以同步方式將結果傳回應用程式。 其他函式(例如撥號)可能無法快速完成,因此以異步方式作。
電話語音作業會以同步或異步方式完成。 這兩個模型不同,如下所示。 同步函式 在允許呼叫端的線程從函式呼叫傳回之前,執行整個要求。 異步函式會在要求完整執行之前傳回。 當異步要求稍後完成時,服務提供者會藉由呼叫TAPI最初在初始化順序早期提供給它的回呼程式來報告完成。
- 異步作具有名為 dwRequestID 的參數, 定義的類型 DRV_REQUESTID 做為其第一個參數。 這類作業會在函數調用中執行其部分處理,並在函式呼叫傳回之後,在獨立執行線程中執行其餘部分。 當函式傳回時,它會傳回負誤差結果或 (正數) dwRequestID 在函數調用中傳遞。 負錯誤結果表示作業已完成(且失敗)。 傳回的正 dwRequestID 表示作業會在獨立線程中繼續。 在這種情況下,服務提供者最終會呼叫 ASYNC_COMPLETION 程式,傳遞 dwRequestID 和結果程序代碼,以指出作業的結果。 成功的結果碼為零,或是同一組 (負數) 錯誤結果的其中一個。 在任何情況下,服務提供者絕對不能從指定為異步的函式傳回零或 dwRequest ID 以外的任何正值,因為這樣做可能會產生非預期的結果。 服務提供者應該一律先從應用程式記憶體將輸入數據複製到服務提供者記憶體,再從異步函式傳回。
- 同步作業沒有 dwRequestID 做為其第一個參數。 這類作業會在呼叫端的執行線程中執行其所有處理,並在傳回時傳回最終結果。 成功的結果為零,或失敗的負錯誤碼。 服務提供者不會呼叫同步作業 ASYNC_COMPLETION。
考慮相對於原始要求傳回的時間,「完成」回呼的時機很有趣。 服務提供者會實作典型的異步要求,如下列虛擬程式代碼所示:
Some_request(Request_ID, ...) {
check parameters for validity
check device state for validity
store Request_ID for Completion Interrupt Handler's use
manipulate device registers to start physical operation
return Request_ID // to indicate asynch operation
}
Operation Completion Interrupt Handler: {
if operation was successful then
call "completion" callback passing Request_ID and "success"
else
call "completion" callback passing Request_ID and "error num"
endif
}
如果作業非常快速完成(或原始要求傳回非常緩慢),在原始要求返回應用程式或甚至 TAPI 之前,可能會觸發實體作業完成時執行的中斷處理程式。 允許此行為。 TAPI 保證在原始要求傳回之後,會傳遞應用程式的最終完成通知。
TAPI 2.x: 列出每個函式同步或異步完成的狀態,TAPI 快速函式參考。