using Microsoft.Extensions.Hosting; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Utility.Tools; using WMS.BLL.DataServer; using WMS.IBLL.IDataServer; namespace Wms { public class DailyTaskService : IHostedService, IDisposable { private Timer _periodicReport; private IStockInfoServer _stock; public DailyTaskService(IStockInfoServer stock) { _stock = stock; } //创建定时任务 public Task StartAsync(CancellationToken cancellationToken) { #region 每天0点执行 //计算距离下一个 0 点的时间间隔 DateTime now = DateTime.Now; DateTime nextZeroHour = now.AddDays(1).Date; TimeSpan delay = nextZeroHour - now; //创建定时器,并设置回调函数 _periodicReport = new Timer(PeriodicReport, null, delay, TimeSpan.FromDays(1)); return Task.CompletedTask; #endregion #region 2分钟执行1次 /*// 计算距离下一个 2 分钟的时间间隔 TimeSpan delay = TimeSpan.FromMinutes(2); // 创建定时器,并设置回调函数 _timer = new Timer(ExecuteDailyTask, null, delay, TimeSpan.FromMinutes(2)); return Task.CompletedTask;*/ #endregion } /// /// 在应用程序关闭时被调用,用于执行清理操作和释放资源。在 ASP.NET Core 应用程序中, /// 当主机关闭时,StopAsync 方法会被调用来停止后台服务,以确保服务能够正确地停止并释放它所占用的资源,比如关闭定时器、释放数据库连接等。 /// /// /// public Task StopAsync(CancellationToken cancellationToken) { // 停止定时器 _periodicReport?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } //定时执行周期报表 private void PeriodicReport(object state) { try { var arr = _stock.ByDayInsertStock(); var logStr = $@".\log\WMS\WMS定时任务" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; LogFile.SaveLogToFile($"WMS定时任务执行异常:{arr},", logStr); //释放资源 _periodicReport?.Dispose(); } catch (Exception ex) { var logStr = $@".\log\WMS\WMS定时任务" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; LogFile.SaveLogToFile($"WMS定时任务执行异常:{DateTime.Now}:( {ex.Message} ),", logStr); } } /// /// 在服务结束运行时,定时器得到正确地清理和释放 /// public void Dispose() { try { var logStr = $@".\log\WMS\WMS定时任务" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; LogFile.SaveLogToFile($"测试是否自动释放:{DateTime.Now}", logStr); //释放资源 _periodicReport?.Dispose(); } catch (Exception ex) { var logStr = $@".\log\WMS\WMS定时任务" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; LogFile.SaveLogToFile($"测试是否自动释放异常:{DateTime.Now}:( {ex.Message} ),", logStr); } } } }