zoukankan      html  css  js  c++  java
  • 利用 BackgroundService 固定时间间隔执行某动作

    继承 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);
            }

    测试结果:

  • 相关阅读:
    MVC学习笔记(六)---遇到的小问题汇总
    C# 手写将对象转换为Json方法
    C# 使用SuperSocket
    C#生成/调用动态链接库
    Winform串口编程---接收数据demo(VSPD虚拟串口)
    js获取浏览器内核判断终端(是QQ打开还是QQ浏览器打开)
    工具函数(获取url , 时间格式化,随机数)
    node和npm的安装和镜像源的修改
    atom常用插件
    查看并关闭端口号
  • 原文地址:https://www.cnblogs.com/zhangchaoran/p/11121846.html
Copyright © 2011-2022 走看看