bklLiudl
2025-04-07 4e8f58cb41c7b6d570fd1979d80f74ab8a4d00c2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
        }
 
        /// <summary>
        /// 在应用程序关闭时被调用,用于执行清理操作和释放资源。在 ASP.NET Core 应用程序中,
        /// 当主机关闭时,StopAsync 方法会被调用来停止后台服务,以确保服务能够正确地停止并释放它所占用的资源,比如关闭定时器、释放数据库连接等。
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        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);
            }
        }
 
        /// <summary>
        /// 在服务结束运行时,定时器得到正确地清理和释放
        /// </summary>
        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);
            }
        }
    }
}