2010-11-24 12 views
6

私は静的なので、必要に応じてモデルから簡単に呼び出すことができるように書いた完全なURLを生成する方法があります。他のクラスの静的プロパティを参照するときのスレッドの安全性

スレッドセーフであるかどうかを判断することはできますが、まだ問題はあります。

ここにコードがあります。私はすでに知っている何

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

次のとおりです。

1)彼らは不変の参照型であるため、渡された2つの文字列がスレッドセーフになります。

2)静的メソッド内でインスタンス化されたすべてのオブジェクトは、その特定のスレッドのスタック上にのみ存在するため、スレッドセーフであると見なすことができます。

私は何がわからないよです:

1)HttpContext.CurrentとRouteTable.Routesの使用は、この方法で再生どのように?それらはどちらも私がコンストラクタに渡している静的なプロパティです。

私の質問は以下のとおりです。

1)これらの静的プロパティを使用する意味は何ですか?

2)この方法の安全性についての私の残りの理解は本当ですか?

3)このような状況でスレッドの安全性を判断するために、今後どのようなルールを守ることができますか?

答えて

2

共有状態を変更していないか、他のスレッドによって変更される可能性が高い状態にアクセスしている限り、問題ありません。

この場合、HttpContext.Currentは現在のスレッドのローカルなので、問題はありません。 RouteTable.Routesは、アプリケーションのスタートアップイベントでのみ変更する必要があります。そのため、OKにする必要があります。

関連する問題