WCF 服務的價值體現在兩個維度:服務品質與承載能力。並發處理直接關係到單一服務實例的吞吐量。WCF 在資源有限的環境中運行,必須在「最大化並發處理」與「防止資源耗盡崩潰」之間找到平衡——這正是 WCF 並發與節流體系設計的初衷。
WCF 將服務實例封裝於 InstanceContext(實例上下文) 中。並發的定義即:同一個 InstanceContext 同時處理多個服務調用請求。這些請求可能來自不同客戶端,也可能來自同一客戶端的多執行緒。

圖 1:單一 InstanceContext 對多個並發請求的處理模型
透過 ServiceBehaviorAttribute.ConcurrencyMode 指定,預設為 Single:
public enum ConcurrencyMode { Single, Reentrant, Multiple }
| 模式 | 處理策略 | 執行方式 | 適用場景 |
|---|---|---|---|
| Single (預設) | 某時刻僅處理單一請求,其餘排隊等待 | 串行(同步鎖) | 狀態式服務、非執行緒安全代碼、簡單業務邏輯 |
| Reentrant | 單一請求處理中,若發生外部回調,允許重入處理其他請求 | 串行 + 回調重入 | 雙工通訊、需回調客戶端的服務 |
| Multiple | 同一 InstanceContext 同時處理多請求 | 並行(多執行緒) | 無狀態服務、高吞吐需求、開發者自行管理執行緒安全 |
// 等效寫法:預設即為 Single
public class CalculatorService : ICalculator { ... }
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]
public class CalculatorService : ICalculator { ... }
雙工通訊中,回調物件同樣封裝於 InstanceContext。回調並發模式獨立配置:
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class CalculatorCallbackService : ICalculatorCallback { ... }
WCF 以近乎相同的機制處理服務調用與回調並發,確保一致性。
當設定 ReleaseServiceInstanceOnTransactionComplete = true 時,服務實例在事務完成後釋放。**此設定僅相容於 ConcurrencyMode.Single**,否則寄宿時拋出 InvalidOperationException:
// 錯誤示範:Multiple + ReleaseServiceInstanceOnTransactionComplete 會失敗
[ServiceBehavior(
ReleaseServiceInstanceOnTransactionComplete = true,
ConcurrencyMode = ConcurrencyMode.Multiple // 必須為 Single
)]
public class BankingService : IBankingService { ... }

圖 2:Multiple 模式下啟用事務釋放實例導致的異常
Single 或 ReentrantMultiple (需自行加鎖)CallbackBehavior.ConcurrencyModeSingle 使用 ReleaseServiceInstanceOnTransactionCompleteSingle 與 Reentrant 採用串行執行,其底層同步機制是如何實現的?WCF 並發框架如何對 InstanceContext 進行加鎖與隊列管理?請關注後續文章深入剖析 WCF 並發同步核心源碼邏輯。