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 是线程安全的,否则只需锁定检查字典。
我已经为 运行 我自己的 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 是线程安全的,否则只需锁定检查字典。