單呼叫模式 (InstanceContextMode.PerCall) 下,每個服務調用請求對應一個新的服務實例上下文,操作結束即回收。本文詳細剖析其生命週期、實例提供機制、釋放時機與擴展性優勢。
完整流程:
InstanceContextProvider 嘗試取得現有上下文(PerCall 永遠回傳 null)。InstanceProvider 建立服務實例,封裝於新 InstanceContext。InstanceContext,呼叫 InstanceProvider 釋放實例(若實作 IDisposable 則呼叫 Dispose)。服務實作 IDisposable,建構函式、Dispose、終結子均輸出訊息。寄宿端每 100ms 強制 GC。客戶端同一代理呼叫兩次 Add。服務端輸出顯示:兩次調用分別建立實例、執行操作、呼叫 Dispose,終結子稍後由 GC 執行。
Service object is instantiated. Operation method is invoked. Service object is disposed. Service object is instantiated. Operation method is invoked. Service object is disposed. Service object is finalized. Service object is finalized.
Dispose 與操作方法**同步執行於相同執行緒**。若 Dispose 耗時,會阻塞來自同一代理的後續請求。範例模擬 5 秒 Dispose,驗證同一代理的兩次非同步調用間隔 5 秒,執行緒 ID 相同。
優勢:資源 (如 DB 連線) 隨操作結束即時釋放,避免閒置爭用,支援更高併發。經驗法則:企業應用併發量約為客戶端總數 1%-3%,若能維持 100 實例,可服務 10,000 客戶端。雖實例頻繁建立有反射開銷,但相較通道建立/釋放微不足道;唯頻繁迴圈調用同代理時需考慮效能平衡。