首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 並發體系同步機制:Single 與 Reentrant 模式實作解析

     編輯:關於.NET

WCF 提供三種並發模式:Multiple(並行)、Single(串列)、Reentrant(可重入串列)。本文深入剖析 InstanceContext 層面的同步實作原理。

ConcurrencyMode.Single: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; } // 內部同步鎖物件
}

執行流程:

  1. 服務端運行時接收訊息
  2. 透過 InstanceContextProvider 取得/建立 InstanceContext
  3. 若服務標記 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]
  4. 分發訊息前,運行時嘗試取得 InstanceContext.ThisLock
  5. 鎖定期間執行操作,完成後釋放

→ 確保同一 InstanceContext 同時間僅處理一個要求。

ConcurrencyMode.Reentrant:重入機制與死結避免

問題:Single 模式下雙工回調導致死結

服務操作中發起雙工回調(Request/Reply 模式),客戶端回覆訊息返回時,運行時嘗試再次分發至同一 InstanceContext,需取得 ThisLock,但鎖仍被外層操作持有 → 死結。

異常訊息(中文化易誤解):

無法處理訊息,因為 InstanceContext 已鎖定。若要用可重入或多重並發,請設定 ConcurrencyMode 為 Reentrant 或 Multiple。

Single 模式回調死結異常

Reentrant 解決方案:暫時釋放鎖

執行流程差異:

  1. 分發要求前加鎖 ThisLock(同 Single)
  2. 發起回調前,運行時釋放鎖
  3. 客戶端回覆返回,運行時重新取得鎖
  4. 繼續執行後續邏輯

Reentrant 行為細節

  • 鎖釋放期間,其他服務要求可被分發至同一 InstanceContext
  • 回調返回時,若 InstanceContext 正處理其他要求,原要求需等待(即使是先來者)
  • 等待超過設定逾時 → 客戶端拋出 TimeoutException

InstanceContextMode 的影響

並發行為受 InstanceContextMode(PerCall、PerSession、Single)影響:

  • PerCall:每個要求新 InstanceContext → 無並發衝突
  • PerSession:同 Session 共享 InstanceContext → 受上述同步機制管控
  • Single:全域單一 InstanceContext → 所有要求共用同一把鎖

下一篇將從 InstanceContextMode 角度進一步剖析 WCF 並發行為。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved