我已经定义了一个自定义的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())
有没有人才的想法呢? (如果可以的话,尽量避免重锁)
答案 0 :(得分:0)
只需将app Id放入静态私有字典中,然后在代码块之前进行检查。检查字典是线程安全的,否则只是锁定检查字典。