2010-11-24 2 views
6

Ich habe eine Methode, um voll qualifizierte URLs zu generieren, die ich als statisch haben möchte, so dass es leicht von Modellen wie benötigt aufgerufen werden kann.C# Thread-Sicherheit beim Verweisen auf statische Eigenschaften in anderen Klassen

Ich habe immer noch Probleme mit der Entscheidung, ob der Thread sicher ist oder nicht.

Hier ist der 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)); 
    } 

Was ich weiß schon:

1) Die beiden bestanden Saiten sicher Thread in da sie unveränderliche Referenztypen sind.

2) Alle Objekte, die in einer statischen Methode instanziiert werden, können als Thread-sicher betrachtet werden, da sie nur auf dem Stack für diesen spezifischen Thread existieren.

Was ich bin nicht sicher ist:

1) Wie wirkt sich die Verwendung von HttpContext.Current und RouteTable.Routes in diesem Verfahren spielen? Sie sind beide statische Eigenschaften, die ich an die Konstruktoren übergebe.

Meine Fragen sind:

1) Was sind die Auswirkungen dieser statischen Eigenschaften mit Hilfe?

2) Ist der Rest meines Verständnisses von der Sicherheit dieser Methode wahr?

3) Welche Regeln kann ich in Zukunft beachten, um die Thread-Sicherheit in Situationen wie diesem zu bestimmen?

Antwort

2

Solange Sie den freigegebenen Status nicht ändern oder auf den Status zugreifen, der wahrscheinlich von anderen Threads geändert wird, ist alles in Ordnung.

In diesem Fall ist HttpContext.Current sowieso lokal für den aktuellen Thread, also ist das kein Problem; und RouteTable.Routes sollte nur im Startup-Ereignis Ihrer Anwendung geändert werden, so dass auch dies in Ordnung sein sollte.

Verwandte Themen