我是C#的新手,最近使用.NET 4.0构建了一个小型Webapp。这个应用程式包含2个部分:一个是设计成可永久运作,并会持续从网路上的指定资源撷取资料。另一个根据请求访问该数据以对其进行分析。我在第一部分中苦苦挣扎。

我最初的方法是设置一个Timer对象,该对象每隔5分钟执行一次提取操作(无论该操作在这里并不重要)。我将在Application_Start上定义该计时器,并在此之后继续使用。

但是,我最近意识到应根据用户请求创建/销毁应用程序(从我的观察来看,它们似乎在一段时间不事件后被销毁)。结果,我的后台事件将停止/恢复到我希望继续运行的控制范围之外,并且绝对不会中断。

:这是我的问题:在Web应用程序中可以实现吗?还是我绝对需要单独的Windows服务来处理这类事情?

在此先感谢您的宝贵帮助!

纪尧姆

最佳答案

虽然在Web应用程序上执行此操作并不理想。可以实现,因为该站点始终处于运行状态。

这里是一个示例:我正在global.asax中创建一个带有过期时间的Cache项。当它到期时,将触发一个事件。您可以在OnRemove()事件中获取数据或任何内容。

然后,您可以设置对页面(最好是很小的页面)的调用,该调用将触发Application_BeginRequest中的代码,该代码将在过期后添加回Cache项。

global.asax:

private const string VendorNotificationCacheKey = "VendorNotification";
private const int IntervalInMinutes = 60; //Expires after X minutes & runs tasks

protected void Application_Start(object sender, EventArgs e)
{

   //Set value in cache with expiration time
   CacheItemRemovedCallback callback = OnRemove;

   Context.Cache.Add(VendorNotificationCacheKey, DateTime.Now, null, DateTime.Now.AddMinutes(IntervalInMinutes), TimeSpan.Zero,
                    CacheItemPriority.Normal, callback);
}

private void OnRemove(string key, object value, CacheItemRemovedReason reason)
{
    SendVendorNotification();

    //Need Access to HTTPContext so cache can be re-added, so let's call a page. Application_BeginRequest will re-add the cache.
    var siteUrl = ConfigurationManager.AppSettings.Get("SiteUrl");
    var client = new WebClient();
    client.DownloadData(siteUrl + "default.aspx");
    client.Dispose();

}

private void SendVendorNotification()
{
    //Do Tasks here
}

protected void Application_BeginRequest(object sender, EventArgs e)
{
    //Re-add if it doesn't exist
    if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("default.aspx") &&
        HttpContext.Current.Cache[VendorNotificationCacheKey] == null)
    {
        //ReAdd
        CacheItemRemovedCallback callback = OnRemove;
        Context.Cache.Add(VendorNotificationCacheKey, DateTime.Now, null, DateTime.Now.AddMinutes(IntervalInMinutes), TimeSpan.Zero,
                          CacheItemPriority.Normal, callback);
    }
}

如果您的计划任务很快,这将很好地工作。
如果这是一个长期运行的过程,那么您肯定需要将其保留在Web应用程序之外。

只要第一个请求启动了应用程序,它就会每60分钟触发一次,即使该站点上没有访问者也是如此。

关于c# - ASP Webapp中的后台任务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6418731/

10-09 01:39