Job


直接貼代碼:

    public interface ICronJob
    {
// 線程運行
void Run(DateTime dateTime);
// 線程終止
void Abort(); }

 

 public class CronJobBase : ICronJob
    {
        private readonly object _object = new object();
        private Thread _thread;
        private DateTime _runTime = DateTime.Now;
        private int _span = 3;//時間間隔 3s
        public CronJobBase()
        {

        }
        public CronJobBase(int span)
        {
            _span = span;
        }
        public void Run(DateTime dateTime)
        {
            if (_thread != null && _thread.ThreadState == ThreadState.Running)
                return;
            if (_runTime.AddSeconds(_span) > dateTime)
                return;
            _runTime = dateTime;
            _thread = new Thread(ExecuteHandler);
            _thread.Start();
        }

        public void Abort()
        {
            _thread.Abort();
        }
        private void ExecuteHandler()
        {
            try
            {
                Execute();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
        }

        protected virtual void Execute()
        {

        }
    }

 

 public class Job : CronJobBase
    {
        private int _span = 0;
        public Job()
        {
        }
        public Job(int span)
            : base(span)
        { this._span = span; }
        protected override void Execute()
        {
            if (_span == 0)
                Console.WriteLine("我是Job,我使用默認時間執行!" + DateTime.Now.ToString("s"));
            else
                Console.WriteLine("我是Job,我間隔{0}s執行!{1}", _span, DateTime.Now.ToString("s"));
        }
    }

 

    public interface ICronMon
    {
        void AddJob(ICronJob job);
        void Start();
        void Stop();
    }

 

 public class CronMon : ICronMon
    {
        private readonly System.Timers.Timer _timer = new System.Timers.Timer(1000);
        private readonly List<ICronJob> _jobs = new List<ICronJob>();
        private DateTime _last = DateTime.Now;

        public CronMon()
        {
            _timer.AutoReset = true;
            _timer.Elapsed += _timer_Elapsed;
        }

        private void _timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (DateTime.Now.Second != _last.Second)
            {
                _last = DateTime.Now;
                foreach (var item in _jobs)
                {
                    item.Run(DateTime.Now);
                }
            }
        }

        public void AddJob(ICronJob job)
        {
            _jobs.Add(job);
        }

        public void Start()
        {
            _timer.Start();
        }

        public void Stop()
        {
            _timer.Stop();
            foreach (var item in _jobs)
            {
                item.Abort();
            }
        }
    }

控制台調用

 class Program
    {
        private static readonly CronMon CronMon = new CronMon();
        static void Main(string[] args)
        {
            Start();
            Console.ReadKey();
        }
        public static void Start()
        {
            CronMon.AddJob(new Job());
            CronMon.AddJob(new Job(10));
            CronMon.AddJob(new Job(5));
            CronMon.Start();
        }
    }

運行效果如下:


免責聲明!

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



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