發表於 程式分享

ASP.Net C#新增排程

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/的實作。

發表留言