WCF 提供三種並發模式:Multiple(並行)、Single(串列)、Reentrant(可重入串列)。本文深入剖析 InstanceContext 層面的同步實作原理。
核心機制:對 InstanceContext.ThisLock 加鎖。
public sealed class InstanceContext : CommunicationObject, IExtensibleObject<InstanceContext> {
internal object ThisLock { get { return base.ThisLock; } } // 繼承自 CommunicationObject
}
public abstract class CommunicationObject : ICommunicationObject {
protected object ThisLock { get; } // 內部同步鎖物件
}
執行流程:
InstanceContextProvider 取得/建立 InstanceContext[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]InstanceContext.ThisLock→ 確保同一 InstanceContext 同時間僅處理一個要求。
服務操作中發起雙工回調(Request/Reply 模式),客戶端回覆訊息返回時,運行時嘗試再次分發至同一 InstanceContext,需取得 ThisLock,但鎖仍被外層操作持有 → 死結。
異常訊息(中文化易誤解):
無法處理訊息,因為 InstanceContext 已鎖定。若要用可重入或多重並發,請設定 ConcurrencyMode 為 Reentrant 或 Multiple。

執行流程差異:
ThisLock(同 Single)TimeoutException並發行為受 InstanceContextMode(PerCall、PerSession、Single)影響:
下一篇將從 InstanceContextMode 角度進一步剖析 WCF 並發行為。