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

Make method run only once in multi-threaded http sessions

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

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 实例会动态创建多次,我想确保 InitOnce() 只能在 MyApp1,2,3..N 第一次创建时处理一次。 (就像将 InitOnce() 放在它们的每个静态构造函数中一样)

有没有什么天赋点子可以做到这一点? (如果可以的话尽量避免重锁)

把app Id放到一个静态的私有字典里,在代码块之前查一下就可以了。 Check Dictionary 是线程安全的,否则只需锁定检查字典。