中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

LindAgile.SchedulingTask~設(she)計一(yi)個不錯的任(ren)務調度組件

回到目錄

SchedulingTask產生的原因

任務調試主要(yao)指定期(qi)執行某些任務代(dai)碼,之前用(yong)過(guo)quartz,感(gan)覺有(you)些重,使用(yong)時需要(yao)添加包包,配置管理項時,對于簡(jian)單(dan)的(de)(de)項目用(yong)它就顯得有(you)些臃腫了(le)(le),不如直接上個簡(jian)單(dan)的(de)(de)東西來(lai)實現(xian),所有(you)才(cai)有(you)了(le)(le)今天的(de)(de)SchedulingTask,它被(bei)大叔集成到了(le)(le)最新的(de)(de)lindAgile框(kuang)架里,也是Modules的(de)(de)一個子單(dan)元,在項目啟動時由ModuleManager統(tong)一完成注冊!

SchedulingTask核心的設計圖

SchedulingTask的注冊

 ModuleManager.Create()
              .UseDefaultContainer()
              .UseLogger()
              .UseMockRepository()
              .UseDefaultMq();

而對于我們每(mei)個Job任(ren)務(wu),需要開發人(ren)員根據(ju)業務(wu)要求去編(bian)寫,它們將(jiang)繼承一個叫ScheduleBase的(de)(de)抽象類,此類為我們提供(gong)了調度周期,任(ren)務(wu)執行(xing)器(qi)等核心的(de)(de)邏輯!

        /// <summary>
        /// 啟動任務
        /// </summary>
        /// <param name="name"></param>
        /// <param name="action"></param>
        /// <param name="dueTime">執行方法前(qian)的(de)延時時間,毫秒</param>
        /// <param name="interval">執行方法的時間間隔,毫秒(miao)</param>
        public void StartTask(string name, int interval)
        {
            lock (_lockObject)
            {
                if (_taskDict.ContainsKey(name)) return;
                var timer = new Timer(TaskCallback, name, Timeout.Infinite, Timeout.Infinite);
                _taskDict.Add(name, new TimerTaskModel
                {
                    Name = name,
                    Callback = Excute,
                    Timer = timer,
                    IntervalMillisecond = interval,
                    Stopped = false
                });
                timer.Change(interval, 0);
            }
        }

而它與其它具體JOB的關系,我們可以用一(yi)張圖來表示

對于任務的啟動,我們由ScheduleFactory來完成,它會將當前運行時下所有繼(ji)承ScheduleBase的Job類(lei)都加載到容器里,通過自己的調試周(zhou)期去定(ding)時執(zhi)行!

        /// <summary>
        /// 開始任(ren)務q
        /// 裝置(zhi)所有任務,并啟動(dong)它的StartTask()方(fang)法
        /// </summary>
        public void Run()
        {
            foreach (var item in GetAllTypes())
            {
                var obj = Activator.CreateInstance(item, true);
                MethodInfo methodinfo = item.GetMethod("StartTask");
                _iLogger.Logger_Info(string.Format("{0}這個Job開始(shi)執行", item.Name));
                methodinfo.Invoke(obj,
                    new object[]
                    {
                        item.Name,
                        _intervalMillisecond > 0
                                   ? _intervalMillisecond
                                   : item.GetProperty("IntervalMillisecond").GetValue(obj)
                    });
            }
        }

而對于使用者(zhe)來(lai)說,要做的(de)就是(shi)建(jian)立自己的(de)業務Job和在程序入口添加對Run的(de)使用即可

            #region TaskJob
            sf.UseLogger().Run();
            Console.ReadKey();
            #endregion

結果如圖

希望(wang)各位繼續支持(chi)微軟,支持(chi)咱們自(zi)己的.net技術!

謝謝!

回到目錄

posted @ 2017-05-05 15:50  張占嶺  閱讀(1248)  評論(0)    收藏  舉報