首页 > 其他 > 详细

利用 BackgroundService 固定时间间隔执行某动作

时间:2019-07-02 18:07:15      阅读:112      评论:0      收藏:0      [点我收藏+]

继承 BackgroundService 类:

  为什么会写这个东西呢?本人在写消息队列的时候思考过一个问题——比如,每5秒从队列里面取一条消息(一条消息里面又包含了1000条数据),要把这1000条数据处理完所需要的时间远大于5秒,即执行到中间的时候就会获取新的一条消息,并执行新的消息里面的数据,我所存在的疑问是,这个时候第一条消息里面的数据会被怎么执行?所以就写了这样的代码进行了测试!测试的结果是:每一次执行都会开启一条新的线程,而线程内部的数据是互不影响的,每一个线程都会执行到底!

    class TimedBackgroundService : BackgroundService
    {
        private Timer _timer;
        private int i = 0;

        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));           //每5秒开启一个线程
            return Task.CompletedTask;
        }

        private void DoWork(object state)
        {
            i++;
            int name = i;       //i表示这是第几个线程

            for (int j = 0; j < 100; j++)
            {
                Console.WriteLine($"这里是线程{name}:  正在执行j = {j}");
                Task.Delay(TimeSpan.FromSeconds(1)).Wait();        //等待1秒
            }
        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            return ExecuteAsync(cancellationToken);
        }

        public override void Dispose()
        {
            base.Dispose();
            _timer?.Dispose();
        }
    }

调用:

        public static void CheckBackgroundService()
        {
            TimedBackgroundService server = new TimedBackgroundService();
            CancellationToken token = new CancellationToken();
            server.StartAsync(token);
        }

测试结果:

技术分享图片

 

利用 BackgroundService 固定时间间隔执行某动作

原文:https://www.cnblogs.com/zhangchaoran/p/11121846.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!