2016-03-28 8 views
0

に一度だけ実行し、私はこのように自分のWebアプリケーションを実行するためのHttpHandlerをカスタマイズし定義しました:メイクの方法は、マルチスレッドHTTPセッション

public interface IMyApp { 
    public void InitOnce(); 
    public void Run(); 
} 

public class MyApp1 : IMyApp { 
    public void InitOnce() { 
     // heavy-load some data on initializing 
    } 

    public void Run() { 
    } 
} 

// 
// and there are MyApp2, MyApp3 .... MyAppN both implement IMyApp interface 
// 

public class MyHttpHandler : IHttpHandler, IRequiresSessionState { 
    public bool IsReusable { get; } = false; 

    public virtual void ProcessRequest(HttpContext ctx) { 
     var appID = ctx.Request.Params["appID"]; 
     // create a fresh app instance depend on user request. 
     var app = (IMyApp)AppUtil.CreateInstance(appID); 

     /* 
     * TODO: I want some magics to make this method run only once. 
     */ 
     app.InitOnce(); 

     app.Run(); 
    } 
} 

としてMyAppXインスタンスが作成される動的に何度も、私がしたいです最初にMyApp1,2,3..Nが作成されたときに初めてInitOnce()を処理できることを確認してください。 (それぞれの静的コンストラクタにInitOnce()を入れるのと同じように)

これを行うための才能はありますか?

+0

他のインスタンスは初期化が完了するまで待たなければならないので、 'InitOnce'の中で' lock'以外のことはできますか?あるいは、[シングルトン](http://stackoverflow.com/a/1131826/11683)があなたに適しているかもしれません。 – GSerg

+0

thxと "Lock"は、この場合、InitOnce()の内部または外部のいずれかで期待どおりに動作します。しかし、どのような種類のロックを好むのですか?私は、パフォーマンスを最大限にし、すべての要求に対して「重いロック取得リリース」アクションを待つのを避けようとします。 @GSerg – ineztia

+0

私は 'lock'キーワードを意味しました。パフォーマンスについては、たとえばhttp://stackoverflow.com/q/4673618/11683 – GSerg

答えて

0

アプリIDを静的なプライベート辞書に入れて、コードブロックの前にチェックするだけです(重いロックを避けるようにしてください)。チェックディクショナリはスレッドセーフです。それ以外の場合は、ディクショナリをチェックしてロックをかけるだけです。

+0

これは私が試した方法です。これは、 "appID-check-modify"アクションをスレッドセーフにするために、あるレベルで辞書をロックする必要があることを意味します。 @Daniel van Heerden – ineztia

+0

辞書チェックと挿入の周りにロックを入れるだけです。それを台無しにしないでください。 'lock(locker){if(_mydictionary.ContainsKey(appid)return; _mydictionary.Add(appid、null);}のようなものは、あなたがそれをもっと複雑にする必要があるとは思わない。 –

関連する問題