为什么定时器到时间不会触发停止的方法

Gin242 2024-02-03 18:09:44

using MES.App.Interface;
using MES.App.SSO;
using MES.Repository;
using MES.Repository.Domain;
using MES.Repository.Interface;
using Microsoft.Extensions.Hosting;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MES.App.Apps.Produce
{
    public class AutoOffWorkApp : BaseApp<Production_EmpWorktime>, IHostedService, IDisposable
    {
        private Timer timer;
        public AutoOffWorkApp(IUnitWork unitWork, IRepository<Production_EmpWorktime> repository, IAuth auth) : base(unitWork, repository, auth)
        {
        }
        public class TimerParams
        {
            public long EmpId { get; set; } = 0;
            public long FacId { get; set; } = 0;
        }
        public Task StartAsync(CancellationToken cancellationToken, string time, int minutesToAdd, long empId, long facId)
        {
            DateTime now = DateTime.Now;

            // 解析传入的时间字符串
            if (DateTime.TryParse(time, out DateTime offWorkTime))
            {
                // 加上延迟下班的分钟数
                offWorkTime = offWorkTime.AddMinutes(minutesToAdd);
                // 判断传入的时间是否小于当前时间
                if (offWorkTime.Hour < now.Hour || (offWorkTime.Hour == now.Hour && offWorkTime.Minute < now.Minute))
                {
                    offWorkTime = offWorkTime.AddDays(1);
                }
            }
            TimeSpan delay = offWorkTime - now;
            var timerParams = new TimerParams { EmpId = empId, FacId = facId };

            // 设置一个定时器,在下班时间到达时触发自动下班方法
            timer = new Timer(OnOffWork, timerParams, delay, Timeout.InfiniteTimeSpan);

            return Task.CompletedTask;
        }
        private void OnOffWork(object state)
        {
            var timerParams = (TimerParams)state;
            long empId = timerParams.EmpId;
            long facId = timerParams.FacId;
            var curUser = Auth.GetCurrentUser().User;
            var query = from w in UnitWork.Find<Production_EmpWorkRecord>(null)
                        where w.Status.Equals(0)
                        select w;
            if (empId > 0)
                query = query.Where(u => u.EmpId.Equals(empId));
            if (facId > 0)
                query = query.Where(u => u.FacilityId.Equals(facId));
            var list = query.ToList();
            foreach (var item in list)
            {
                item.EndTime = DateTime.Now;
                item.Status = 1;
                UnitWork.Update(item);
                var worktime = new Production_EmpWorktime()
                {
                    CreateTime = DateTime.Now,
                    CreateUserId = curUser.Id,
                    CreateUserName = curUser.Name,
                    LastUpdateTime = DateTime.Now,
                    LastUpdateUserId = curUser.Id,
                    LastUpdateUserName = curUser.Name,
                    EmpId = item.EmpId,
                    EndTime = item.EndTime,
                    EntityId = item.EntityId,
                    Remark = "",
                    RestMinutes = 0,
                    StartTime = item.CreateTime,
                    WorkDate = item.CreateTime,
                    JobId = item.JobId,
                    GroupId = item.GroupId,
                    Attr = item.Attr,
                    EmpLevel = item.EmpLevel,
                    FacilityId = item.FacilityId,
                    WorkMinutes = (decimal)(item.EndTime - item.CreateTime).TotalMinutes,
                };
                UnitWork.Add(worktime);
            }
            UnitWork.Save();
            // 停止定时器
            timer?.Dispose();
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            // 停止定时器
            timer?.Dispose();

            return Task.CompletedTask;
        }

        public void Dispose()
        {
            // 释放资源
            timer?.Dispose();
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }
    }
}
调用

 string offWorkTime = classInfo.Endtime;
 int minutesToAdd = classInfo.DelayOffworkMins;
 _autoOffWorkApp.StartAsync(CancellationToken.None, offWorkTime, minutesToAdd, empId, facId);

...全文
197 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 02-03
精选
  • 打赏
  • 举报
回复
您的问题已经帮您同步至问答, 链接: https://ask.csdn.net/questions/8062102, 请您保持关注, 如果回答有帮助解决此问题, 麻烦您动动小手给相关的回答点赞, Ada会在评论区为您更新结题状态
夜雨悠扬 1天前
  • 打赏
  • 举报
回复

timer不是需要start才能开始工作吗

110,203

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧