asp.netではリクエストはマルチスレッドでコールされますが、多重実行したくないときに、次の拡張関数に渡すことで多重実行を防げます。
public static void ExecuteSync(Action SynchronousAction, Action OnBlocked)
{
string appKey = "MyState";
var app = System.Web.HttpContext.Current.Application;
app.Lock();
var state = app[appKey];
if (state == null)
{
app[appKey] = new object();
}
app.UnLock();
if (state != null)
{
OnBlocked();
return;
}
try
{
SynchronousAction();
}
finally
{
app.Lock();
app.Remove(appKey);
app.UnLock();
}
return;
}