FluentScheduler實現定時任務


FluentScheduler是一個簡單的任務調度框架,使用起來非常方便。作者的源碼和例子的地址:

https://github.com/fluentscheduler/FluentScheduler

1.首先引用FluentScheduler.dll,dll數據源可通過NuGet程序包獲取。打開管理解決方案的NuGet程序包,輸入FluentScheduler即可。

步驟:狀態欄選擇 工具 - NuGet程序包管理器 – 管理解決方案的NuGet程序包,然后輸入FluentScheduler即可。

 2.新建Registry繼承類

using System;
using FluentScheduler;
using System.Threading;

namespace DemoProject2020
{
    public class TimingRoutine:Registry
    {
        public  TimingRoutine()
        {
            Welcome();
        }
        private void Welcome()
        {
            // 每2秒一次循環
            Schedule<TaskJob>().ToRunNow().AndEvery(2).Seconds();

            // 5秒后,只一次
            Schedule<TaskJob>().ToRunOnceIn(5).Seconds();

            //每天晚上21:15分執行
            Schedule(() => Console.WriteLine("Timed Task - Will run every day at 9:15pm: " + DateTime.Now)).ToRunEvery(1).Days().At(21, 15);

            // 每個月的執行
            Schedule(() =>
            {
                Console.WriteLine("Complex Action Task Starts: " + DateTime.Now);
                Thread.Sleep(1000);
                Console.WriteLine("Complex Action Task Ends: " + DateTime.Now);
            }).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);

            //先執行第一個Job、再執行第二個Job;完成后等5秒繼續循環
            Schedule<TaskJob>().AndThen<TaskJob>().ToRunNow().AndEvery(5).Seconds();
            //直接運行
            Schedule(() => Console.Write("3, "))
                .WithName("[welcome]")
                .AndThen(() => Console.Write("2, "))
                .AndThen(() => Console.Write("1, "))
                .AndThen(() => Console.WriteLine("Live!"));
        }
    }
    
}
View Code

3.新建調用任務類繼承IJob

using System;
using System.IO;
using FluentScheduler;

namespace DemoProject2020
{
    public class TaskJob:IJob
    {
        void IJob.Execute()
        {
            var str = "循環每2秒執行一次;現在時間是:" + DateTime.Now.ToString();
            System.IO.StreamWriter writer = null;
            try
            {
                //寫入日志 
                string path= Server.MapPath("~/logs"); ;
                //不存在則創建錯誤日志文件夾
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                path += string.Format(@"\{0}.txt", DateTime.Now.ToString("yyyy-MM-dd"));
                writer = !System.IO.File.Exists(path) ? System.IO.File.CreateText(path) : System.IO.File.AppendText(path); //判斷文件是否存在,如果不存在則創建,存在則添加
                writer.WriteLine(str);
                writer.WriteLine("********************************************************************************************");
            }
            finally
            {
                if (writer != null)
                {
                    writer.Close();
                }
            }
        }
    }

}
View Code

 4.新建Global.asax,全局應用程序處理類

 Global.asax添加注冊定時程序

 protected void Application_Start(object sender, EventArgs e)
        {
            //注冊定時任務
             JobManager.Initialize(new TimingRoutine());             
        }

 補充:

Let's suppose it's 10:00 of a Monday morning and you want to start a job that runs every Monday at 14:00. Should the first run of your job be today or only on the next week Monday?

If you want the former (not waiting for a whole week):

如果想每周一10點運行,那個你選擇現在就開始你的任務還是下周一再進行執行,如果現在開始,而不是等一周后執行

// Every "zero" weeks
Schedule<MyJob>().ToRunEvery(0).Weeks().On(DayOfWeek.Monday).At(14, 0);
Or if you want the latter (making sure that at least one week has passed):

如果選擇下周一執行,確保至少一周已經過去。
// Every "one" weeks
Schedule<MyJob>().ToRunEvery(1).Weeks().On(DayOfWeek.Monday).At(14, 0);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM