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

WCF 服務實例生命週期控制(下):單例模式與並發擴展性

     編輯:關於.NET

單例模式 (InstanceContextMode.Single) 下,WCF 僅建立唯一服務實例處理所有客戶端請求,狀態為所有客戶端共享。本文示範單一性驗證、已知單例與隱式單例、單例實例上下文建立機制,並探討並發模式對擴展性的影響。

一、實例演示:服務實例的單一性

累加器服務:Add 累加、GetResult 取值。兩個代理分別呼叫 Add(3),第二個代理取得結果為 6,證實共享同一實例。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculator
{
    private double _result;
    public void Add(double x) { this._result += x; }
    public double GetResult() { return this._result; }
}

二、單例服務實例上下文提供機制

1. 已知單例 vs 隱式單例

  • 已知單例:自行建立服務實例,透過 new ServiceHost(singletonInstance, baseAddresses) 寄宿。可從 ServiceHost.SingletonInstance 或 OperationContext.Current.Host 取得。
  • 隱式單例:由 WCF 內部於 ServiceHost 初始化階段透過無參建構函式建立,儲存於 ServiceBehaviorAttribute.hiddenSingleton。

2. 單例 InstanceContext 建立時機

發生於 ServiceHost.Open() 期間的「應用分發行為」步驟。ServiceBehaviorAttribute.ApplyDispatchBehavior 依據是否有已知單例,決定以哪個實例建立 SingletonInstanceContext,並設定至 DispatchRuntime.SingletonInstanceContext。因 DispatchRuntime 生命週期等同 ServiceHost,故達成真正單例。

三、單例服務與可擴展性

預設並發模式 ConcurrencyMode.Single 導致多線程同步存取單一實例,嚴重限制吞吐量。測試 5 併發請求,每請求耗時 5 秒:

  • PerCall 模式:約 5 秒完成所有請求。
  • Single + ConcurrencyMode.Single:串行執行,耗時 25 秒。
  • Single + ConcurrencyMode.Multiple:並行執行,約 5 秒完成,但需自行處理狀態同步(如加鎖)。

ConcurrencyMode 可透過 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 設定。選擇 Multiple 時,開發者須確保執行緒安全。

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