mvc访问控制器后做Timer定时任务继承IHostedService类

Timer,CancellationToken,IHostedService,IDisposable注意使用的类
本来是要做依赖注入 方法在接口上实现 现在出了点其他报错原因 先把代码实现
首先声明一个接口 继承IHostedService,IDisposable他会继承实现我们要使用的方法

public interface IService : IHostedService, IDisposable
    {
        void exec();
    }

第二步建一个Service继承IService

public class Service : IService
    {
        public static int a = 0;
        private Timer _timer;
    
        /// <summary>
        /// 继承IHostedService
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StartAsync(CancellationToken cancellationToken)
        {
            _timer = new Timer(dowork, null, TimeSpan.Zero,
                  TimeSpan.FromSeconds(2));//频率两秒一次
            return Task.CompletedTask;
        }
        public void dowork(object state)
        {
            exec();
        }
        /// <summary>
        /// 执行代码块
        /// </summary>
        public void exec()
        {
            a++;
            Console.WriteLine("第{0}次执行", a);
        }


        /// <summary>
        /// 继承IHostedService
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StopAsync(CancellationToken cancellationToken)
        {
            _timer?.Change(Timeout.Infinite, 0);
            return Task.CompletedTask;
        }
        /// <summary>
        /// 继承IDisposable
        /// </summary>
        public void Dispose()
        {
            _timer?.Dispose();
        }
     
    }

第三步 程序启动后 访问控制器后调用Service

public class HomeController : Controller
    {
        //这里依赖注入报错 暂时先不按构造函数的方法写
        //private IService _service;
        //private HomeController(IService service)
        //{
        //    _service = service;
        //}
        public IActionResult Index()
        {
            //CancellationTokenSource 和 CancellationToken在异步任务中的使用 
            // CancellationTokenSource cts = new CancellationTokenSource(1000);   或者传入时间 毫秒  或者Timespan
            //创建一个 CancellationTokenSource,然后调用异步方法时,传入 CancellationToken,它是一个轻量级对象,可以通知请求是否已取消
            CancellationTokenSource cts = new CancellationTokenSource();
            Service service = new Service();
            service.StartAsync(cts.Token);
            return View();
        }
    }

最后实现效果 自动执行

posted @ 2021-08-03 17:47  原往  阅读(99)  评论(0)    收藏  举报