Global.asax.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using System.Web.Security;
using System.Web.SessionState;
namespace JBMartAPI
{
public class MvcApplication : System.Web.HttpApplication
{
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static CacheItemRemovedCallback OnCacheRemove = null;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
logger.Info("Start Task...");
AddTask("Task A", 10);
AddTask("Task B", 120);
}
private void AddTask(string name, int seconds)
{
OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
HttpRuntime.Cache.Insert(name, seconds, null,
DateTime.UtcNow.AddSeconds(seconds), System.Web.Caching.Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, OnCacheRemove);
//HttpRuntime.Cache.Insert(name, seconds, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(seconds));
}
public void CacheItemRemoved(string key, object value, CacheItemRemovedReason reason)
{
//do something based on the key value
switch (key)
{
case "Task A":
Debug.Print("Task A");
logger.Info("Task A");
break;
case "Task B":
Debug.Print("Task B");
logger.Info("Task A");
break;
default:
break;
}
//re-schedule the task cache item
AddTask(key, Convert.ToInt32(value));
}
}
}
Ref.參考http://www.steepvalley.net/background-tasks-in-asp-net-web-services-or-api/的實作。
