前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 实现时间来到新的一天时触发事件

C# 实现时间来到新的一天时触发事件

作者头像
独立观察员
发布2023-12-26 11:21:28
2350
发布2023-12-26 11:21:28
举报

C# 实现时间来到新的一天时触发事

独立观察员 2023 年 12 月 19 日

看到知乎有人提问《C# 如果要实现一个任务每天 0 点执行,用什么方法等待更高效?》,回想起之前写过的一个方法,现在翻出来大家讨论讨论。

新建一个时间事件帮助类(单例),通过定时器,到第二天 0 点后触发 [新的一天] 事件,使用的地方订阅这个事件即可。

代码语言:javascript
复制
/// <summary>
/// 时间事件帮助类
/// </summary>
public class TimeEventHelper
{
    #region 静态内部类单例

    /// <summary>
    /// 私有构造函数,防止从外边实例化
    /// </summary>
    private TimeEventHelper()
    {
        _NewDayTimer.Interval = 1000 * (DateHelper.GetTodaySecond() + 2);
        WriteLog($"【定时器】将在 {DateTime.Now.AddMilliseconds(_NewDayTimer.Interval):yyyy-MM-dd HH:mm:ss} 触发 [新的一天] 事件 ");
        _NewDayTimer.Elapsed += NewDayTimerHandler;
    }

    /// <summary>
    /// 公有静态成员方法,返回唯一实例
    /// </summary>
    /// <returns> 单例 </returns>
    public static TimeEventHelper GetInstance()
    {
        return InnerClass.instance;
    }

    /// <summary>
    /// 内部类,第一次调用 GetInstance () 时加载 InnerClass
    /// </summary>
    class InnerClass
    {
        // 在类被实例化或静态成员被调用的时候进行调用
        // 这里也就是当 instance 被调用的时候,会执行静态函数,初始化成员变量
        static InnerClass() { }
        internal static readonly TimeEventHelper instance = new TimeEventHelper();
    }

    #endregion

    #region 成员

    /// <summary>
    /// [新的一天] 判断定时器
    /// </summary>
    private readonly Timer _NewDayTimer = new Timer(1000) { AutoReset = true, Enabled = true };

    /// <summary>
    /// [新的一天] 事件
    /// </summary>
    public event Action NewDayEvent;

    #endregion

    /// <summary>
    /// 写日志
    /// </summary>
    /// <param name="logStr"> 日志内容 </param>
    private void WriteLog(string logStr)
    {
        LogManager.GetCurrentClassLogger().Debug(logStr);
    }

    /// <summary>
    /// [新的一天] 定时器执行方法
    /// </summary>
    public void NewDayTimerHandler(object source, System.Timers.ElapsedEventArgs e)
    {
        try
        {
            string eventName = "新的一天";

            WriteLog($" 开始触发 [{eventName}] 事件...");
            _NewDayTimer.Stop();

            NewDayEvent?.Invoke();
            WriteLog($" 触发 [{eventName}] 事件完成.");

            _NewDayTimer.Interval = 1000 * (DateHelper.GetTodaySecond() + 2);
            WriteLog($"【定时器】将在 {DateTime.Now.AddMilliseconds(_NewDayTimer.Interval):yyyy-MM-dd HH:mm:ss} 触发 [{eventName}] 事件 ");
            _NewDayTimer.Start();
        }
        catch (Exception ex)
        {
            WriteLog($"[新的一天] 定时器执行方法中异常:{ex}");
        }
    }
}

定时器的时间间隔是关键,使用一个方法来获取当天剩余秒数,并在触发后重新设置:

代码语言:javascript
复制
/// <summary>
/// 获取当日的剩余 / 已过秒数
/// </summary>
/// <param name="isRest"> 是否获取剩余秒数 </param>
/// <returns> 秒数 </returns>
public static double GetTodaySecond(bool isRest = true)
{
    if (isRest)
    {
        DateTime dtime = DateTime.Today.AddDays(1).Date;
        TimeSpan ts = dtime - DateTime.Now;
        return ts.TotalSeconds;
    }
    else
    {
        DateTime dtime = DateTime.Today.Date;
        TimeSpan ts = DateTime.Now - dtime;
        return ts.TotalSeconds;
    }
}

使用示例:

原创文章,转载请注明: 转载自 独立观察员 (dlgcy.com)

本文链接地址: [C# 实现时间来到新的一天时触发事件](https://dlgcy.com/csharp-new-day-event/)

C#

C# 字符串排序时指定偏好的排列顺序

对于 C# 中 Task 的 StartNew 与 WhenAll 相互配合的实验

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?

C#10 新特性 [调用方参数表达式] 解决了我七年前的困惑

【分享】C# 字节帮助类 ByteHelper

C# 在自定义的控制台输出重定向类中整合调用方信息

C# 枚举转列表

.NET

Windows 服务 同时启动多个服务

PostSharp 中 AOP 功能的简单使用

.NET SDK-Style 项目(Core、Standard、.NET5)中的版本号

将 .NET Framework 项目转换为 .NET Standard 项目

ASP.NET Core MVC 网站学习笔记

Unity 容器简单使用方法

Unity容器依赖注入之属性注入使用备忘

添加服务引用来使用WebService

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 独立观察员博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C# 实现时间来到新的一天时触发事
    • C#
      • .NET
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档