在ASP.NET中请求后推迟操作的最佳方法是什么?

时间:2009-01-21 22:12:35

标签: asp.net

我正在编写一个ASP.NET应用程序。当处理特定类型的请求时,我想安排在处理请求后的某个分钟内调用的方法。推迟的方法不需要与提出原始请求的客户端通信,它只是打算做一些“内务”工作。在ASP.NET上下文中执行此操作的最佳方法是什么? (如果应用程序域由于某种原因而死亡,则不会触发该事件。)

3 个答案:

答案 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();
    }