• .net实现定时任务(Cache+HttpModule)


    主要通过IHttpModule的Init事件及缓存的过期回调事件来实现定时执行任务。

    自定义HttpModule:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace TimingTasks.Controllers
    {
        public class HttpModule:IHttpModule
        {
            public void Init(HttpApplication context)
            {
                var tasker = new CacheTimingTasker();
                tasker.RegistCacheTimmer();
            }
    
            public void Dispose()
            {
    
            }
        }
    }

    CacheTimingTasker:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.Caching;
    using System.Web.Hosting;
    
    namespace TimingTasks.Controllers
    {
        public class CacheTimingTasker
        {
            const string LogPath = "~/log/log.txt";
            const string CacheKeyName = "TimingTasker";//缓存的名字
            const int ExpireTime = 20;//执行周期(秒)
            private static Cache WebCache = HttpRuntime.Cache;
    
            /// <summary>
            /// 当缓存不存在的时候则注册该缓存
            /// </summary>
            public void RegistCacheTimmer()
            {
                if (WebCache[CacheKeyName] != null) return;
                WebCache.Add(CacheKeyName, '1', null,
                    DateTime.Now.AddSeconds(ExpireTime),
                    Cache.NoSlidingExpiration,
                    CacheItemPriority.High,
                    CacheItemOnRemoved);
                WriteCacheLog("缓存时钟注册成功");
            }
    
            /// <summary>
            /// 缓存过期的回调函数
            /// </summary>
            /// <param name="key">缓存的名字</param>
            /// <param name="value">缓存的值</param>
            /// <param name="reason">缓存原因</param>
            protected void CacheItemOnRemoved(string key, object value, CacheItemRemovedReason reason)
            {
                if (key == CacheKeyName)
                {
                    ExecJob();
                    RegistCacheTimmer();
                }
            }
    
            protected void ExecJob()
            {
                //do sth in plan
                WriteCacheLog("调用计划任务");
            }
    
            public static void WriteCacheLog(string logInfo)
            {
                using (var sw = new StreamWriter(HostingEnvironment.MapPath(LogPath), true, Encoding.UTF8))
                {
                    sw.WriteLine(String.Format("{0} {1}",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),logInfo));
                }
            }
        }
    }

    web.config相关设置:

          </namespaces>
        </pages>
        <httpModules>
          <add type="TimingTasks.Controllers.HttpModule" name="HttpModule" />
        </httpModules>
        <globalization requestEncoding="utf-8" responseEncoding="utf-8" />
      </system.web>

    测试记录:

    参考资料:http://www.goberl.com/archive/item60.aspx

    FIN。

  • 相关阅读:
    模态对话框可能导致程序崩溃
    C++实现将字符串循环左移n个位置
    Android Gallery图片显示和文字提示及Menu 菜单
    android代码实现ScaleAnimation
    Android系统内存管理的问题
    android打电话发短信
    android开发之屏幕设置
    输入法
    黄金周
    气筒
  • 原文地址:https://www.cnblogs.com/elycir/p/2629912.html
Copyright © 2020-2023  润新知