我是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/