2016-05-30 1 views
2

J'ai un ctor statique qui extrait une configuration de mon serveur de configuration et définit une variable statique.Y a-t-il une chance qu'une instance d'une classe (ctor normal) soit créée avant que ctor statique ne termine son exécution (dans un environnement multithread)?

J'ai un ctor régulier qui instancie certaines propriétés basées sur cette configuration.

Voici un exemple de ma classe:

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 
    } 
} 

En supposant que j'ai un WCF service qui reçoit plusieurs demandes, chaque demande instancie MyClass et exécute la méthode DoSomething.

Le ctor statique effectue un appel de service Web qui prend un certain temps jusqu'à ce qu'il obtienne le résultat.

Puis-je être sûr que le ctor statique finira de fonctionner avant toute demande recevra une instance de MyClass?

Je sais que les ctors statiques sont thread safe.

Y a-t-il un verrou sur la création de nouvelles instances tant que le ctor statique n'est pas exécuté?

+2

Il sera appelé _before_ toute instance est créée, alors oui vous pouvez être sûr. Cependant j'espère que vous comprenez à quel point il est mal d'appeler _web service_ du constructeur statique. – Evk

+0

Je déteste miner votre conception, mais avoir un constructeur statique appelle un service externe qui prend du temps (et peut, par définition: échouer) me semble une très mauvaise idée. –

+0

@MarcGravell Evk - Merci pour la réponse. Je comprends que le design n'est pas la meilleure pratique et je cherche une meilleure solution. En supposant que vous avez un service qui récupère sa configuration à partir d'un serveur de configuration, quelle est la meilleure approche pour récupérer la configuration avant d'instancier la classe? J'ai certaines propriétés qui nécessitent la configuration et doivent être instanciées à chaque requête (par exemple l'unité de travail). Merci. –

Répondre

1

Les constructeurs statiques sont garantis avant d'être créés. De MSDN.

Un constructeur statique est automatiquement appelée pour initialiser la classe avant la première instance est créée ou les membres statiques sont référencés.

+0

Bien que factuel, je ne pense pas que cela répond vraiment à la préoccupation soulevée dans la question, c'est-à-dire que le constructeur d'instance est appelé depuis un autre thread alors que le constructeur statique est déjà en cours d'exécution. – Rotem

+0

@Rotem "avant la première instance" –