2010-11-24 3 views
6

J'ai une méthode pour générer des URL complètes que j'ai écrites que je voudrais avoir comme statique, donc il est facile d'appeler à partir des modèles si nécessaire.Sécurité du thread C# lors du référencement de propriétés statiques sur d'autres classes

J'ai toujours des problèmes pour pouvoir décider si le fil est sûr ou non.

Voici le code.

public string GenerateURLFromModel(string action, string controller) 
    { 
     HttpContextWrapper wrapper = new HttpContextWrapper(HttpContext.Current); 
     Uri url = HttpContext.Current.Request.Url; 
     UrlHelper urlHelper = new UrlHelper(new RequestContext(wrapper, RouteTable.Routes.GetRouteData(wrapper))); 

     return url.AbsoluteUri.Replace(url.PathAndQuery, urlHelper.Action(action, controller)); 
    } 

Ce que je sais est déjà:

1) Les deux chaînes transmises seront thread-safe car ils sont les types de référence immuables.

2) Tous les objets instanciés dans une méthode statique peuvent être considérés comme des threads sûrs puisqu'ils n'existent que sur la pile pour ce thread spécifique.

Ce que je ne suis pas sûr de est:

1) Comment l'utilisation de HttpContext.Current et RouteTable.Routes jouer dans cette méthode? Ce sont deux propriétés statiques que je passe dans les constructeurs.

Mes questions sont les suivantes:

1) Quelles sont les conséquences de l'utilisation de ces propriétés statiques?

2) Le reste de ma compréhension de la sécurité de cette méthode est-il vrai?

3) Quelles règles puis-je garder à l'esprit dans le futur pour aider à déterminer la sécurité du fil dans des situations comme celle-ci?

Répondre

2

Tant que vous ne modifiez pas l'état partagé ou l'état d'accès susceptible d'être modifié par d'autres threads, alors tout va bien.

Dans ce cas, HttpContext.Current est de toute façon local dans le thread en cours, ce qui n'est pas un problème; et RouteTable.Routes ne devrait être modifié que dans l'événement de démarrage de votre application, de sorte que, aussi, devrait être OK.

Questions connexes