Make方法在多线程http会话中只运行一次

时间:2016-03-28 10:02:58

标签: c# multithreading httphandler

我已经定义了一个自定义的HttpHandler来运行我自己的Web应用程序,如下所示:

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())

有没有人才的想法呢? (如果可以的话,尽量避免重锁)

1 个答案:

答案 0 :(得分:0)

只需将app Id放入静态私有字典中,然后在代码块之前进行检查。检查字典是线程安全的,否则只是锁定检查字典。