ASP.NET WebForms 頁面生命週期中,若每次請求都 new 一個服務物件 (如 PeopleServer),在高併發下會造成大量記憶體分配與 GC 壓力。若該物件無狀態、線程安全,完全可以共用單一實例。
public class PeopleServer {
public PeopleServer() { }
public string ToStringPeople(People p) {
return string.Format("Name:{0},Age:{1};", p.Name, p.Age);
}
}
public class People { public string Name { get; set; } public int Age { get; set; } }
// 頁面中使用
PeopleServer server = new PeopleServer(); // 每次請求配置記憶體
string result = server.ToStringPeople(p);
public class PeopleServer {
private static readonly Lazy<PeopleServer> _instance =
new Lazy<PeopleServer>(() => new PeopleServer(), LazyThreadSafetyMode.ExecutionAndPublication);
private PeopleServer() { } // 防止外部實例化
public static PeopleServer Instance { get { return _instance.Value; } }
public string ToStringPeople(People p) {
return string.Format("Name:{0},Age:{1};", p.Name, p.Age);
}
}
// 使用方式
PeopleServer server = PeopleServer.Instance; // 全程共用同一實例
string result = server.ToStringPeople(p);
Lazy<T> 確保線程安全、延遲初始化 (首次存取 Instance 才建立)private constructor 強制單一實例DbContext),不可 用單例,應採用每請求一個實例 (Dependency Injection Scope)單例模式透過「只建構一次、全域共用」消除重複配置開銷,是無狀態服務在高併發 Web 應用的經典優化手段。現代 .NET 建議使用 Lazy<T> 實現線程安全延遲初始化,搭配 DI 容器 (如 ASP.NET Core 內建 AddSingleton) 管理生命週期,比手寫雙重檢查鎖定更簡潔可靠。