我正在编写一个ASP.NET应用程序。当处理特定类型的请求时,我想安排在处理请求后的某个分钟内调用的方法。推迟的方法不需要与提出原始请求的客户端通信,它只是打算做一些“内务”工作。在ASP.NET上下文中执行此操作的最佳方法是什么? (如果应用程序域由于某种原因而死亡,则不会触发该事件。)
答案 0 :(得分:1)
在检查到该请求是否需要之后,您可以从global.asax.cs中的一个应用程序事件(例如在Application_BeginRequest)中启动一个计时器(System.Timers.Timer)。
然后,在计时器的Elapsed事件的处理程序中,确保停止计时器。
E.g。把这样的东西放到global.asax.cs:
System.Timers.Timer _timer = null;
void Application_BeginRequest(object sender, EventArgs e)
{
// check if cleanup must be initiated
bool mustInitCleanup = RequestRequiresCleanup();
if ((_timer == null) && mustInitCleanup)
{
_timer = new System.Timers.Timer(5000);
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
_timer.Start();
}
}
void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
_timer.Stop();
_timer = null;
// do cleanup task
}
答案 1 :(得分:1)
在Global.asax中使用它来检查您的传入请求:
protected void Application_BeginRequest(object sender, EventArgs e)
{
CheckRequest(HttpContext.Current.Request);
}
如果您的请求有效,请注册一个缓存条目:
private void CheckRequest(HttpRequest request)
{
if (request)
RegisterCacheEntry();
}
private void RegisterCacheEntry()
{
if (HttpRuntime.Cache[CacheItemKey] == null)
{
HttpRuntime.Cache.Add(CacheItemKey, "your key", null,
DateTime.Now.AddSeconds(60), //change to fire in whatever time frame you require
Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable,
new CacheItemRemovedCallback(CacheItemRemovedCallback));
}
}
然后在回调中处理你的函数:
private void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
// execute your function
}
答案 2 :(得分:0)
只需创建一个新线程来执行内务处理工作,并且在开始时让它休眠一段时间,您希望服务器在执行操作之前等待。
例如,在该特定请求中的某个位置,您要调用DoSomething:
aNewThread = new Thread(Foo);
aNewThread.Start();
public void Foo()
{
Thread.Sleep(5000);
DoSomething();
}