2016-05-30 3 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 выполняет вызов веб-службы, который занимает некоторое время, пока не получит результат.

Могу ли я быть уверенным, что статический ctor завершит работу до любым запросом получит экземпляр MyClass?

Я знаю, что статические ctors являются потокобезопасными.

Есть ли какой-либо замок при создании новых экземпляров, пока статический ctor не завершится?

+2

Это будет называться _before_, создается любой экземпляр, так что да, вы можете быть уверены. Однако я надеюсь, что вы понимаете, как плохо называть _web service_ от статического конструктора. – Evk

+0

Мне не нравится подрывать ваш дизайн, но наличие статического конструктора вызывает внешнюю службу, которая требует времени (и может по определению: сбой) кажется мне очень плохой идеей. –

+0

@MarcGravell Evk - Спасибо за ответ. Я понимаю, что дизайн - это не лучшая практика, и я ищу лучшее решение. Предполагая, что у вас есть служба, которая извлекает конфигурацию с сервера конфигурации, каков наилучший способ получения конфигурации до создания экземпляра класса? У меня есть некоторые свойства, которые нуждаются в конфигурации и должны быть созданы при каждом запросе (например, в единице работы). Спасибо. –

ответ

1

Статические конструкторы гарантированно запускаются до создания любого экземпляра. От MSDN.

Статический конструктор вызывается автоматически для инициализации класса до первого экземпляра создается или любые статические члены ссылаются.

+0

Хотя факт, я не чувствую, что это действительно затрагивает проблему, поднятую в вопросе, т. Е. - конструктор экземпляра вызывается из другого потока, пока статический конструктор уже запущен. – Rotem

+0

@Rotem "перед первой инстанцией" –