2016-05-30 21 views
2

我有一個靜態ctor從我的配置服務器獲取配置並設置一個靜態變量。在靜態ctor完成運行之前(在多線程環境中),是否有機會創建類的實例(常規ctor)?

我有一個基於該配置實例化一些屬性的常規ctor。

這是我的類的一個實例:

public class MyClass 
{ 
    private static MyConfig _config; 
    private UnitOfWork _uow; 

    static MyClass(){ 
     // This takes some time since it's a web service call!!! 
     _config = ConfigService.GetConfig(); 
    } 

    public MyClass(){ 
     _uow = CreateUow(_config.UOWConnectionString); 
    } 

    public Response DoSomething(){ 
     // logic with _uow 
    } 
} 

假設我有一個WCF服務接收多個請求,每個請求實例MyClass並運行DoSomething方法。

靜態ctor執行Web服務調用,需要一些時間直到獲得結果。

我能否確定靜態ctor會在之前完成運行?任何請求都將收到MyClass的實例?

我知道static ctors是線程安全的。

在創建新實例之前,是否有任何鎖定,直到靜態ctor完成運行?

+2

它將被稱爲_before_任何實例創建,所以是的,你可以肯定。不過,我希望你明白從靜態構造函數中調用_web service_有多糟。 – Evk

+0

我討厭破壞你的設計,但有一個靜態構造函數調用一個需要時間的外部服務(根據定義:可以失敗)看起來對我來說真的是個壞主意。 –

+0

@MarcGravell Evk - 謝謝你的回答。 我知道設計不是最佳實踐,我正在尋找更好的解決方案。 假設你有一個從配置服務器獲取配置的服務,在實例化類之前獲取配置的最佳方法是什麼? 我有一些需要配置的屬性,需要在每個請求(例如工作單元)上實例化。 謝謝。 –

回答

1

靜態構造函數保證在任何實例創建之前運行。從MSDN

靜態構造被自動調用創建第一實例或任何靜態成員是 引用之前初始化該類 。

+0

雖然事實上,我不覺得這真的解決了問題中提出的問題,即 - 當靜態構造函數已經運行時,從另一個線程調用實例構造函數。 – Rotem

+0

@Rotem「一審之前」 –

相關問題