咨询区

  • Behrooz Karjoo

我的应用程序需要做一个 事件触发 的功能,它需要每天定时执行,比如说当天的 16点,我现在的做法是使用一个 timer 按秒轮询判断当前是否为 16:00, 虽然可以玩得转,但我想能不能实现那种 16:00 自动触发回调函数的模式,而不是现在无时无刻的轮询。

回答区

  • noontz

其实很简单,计算触发时间与当前时间的差值,然后将 差值 作为精确的延迟时间,带入到 Task.Delay 中即可,外面再套个 while(true) ,下面是我封装的代码。

/// <summary>
/// Utility class for triggering an event every 24 hours at a specified time of day
/// </summary>
public class DailyTrigger : IDisposable
{/// <summary>/// Time of day (from 00:00:00) to trigger/// </summary>TimeSpan TriggerHour { get; }/// <summary>/// Task cancellation token source to cancel delayed task on disposal/// </summary>CancellationTokenSource CancellationToken { get; set; }/// <summary>/// Reference to the running task/// </summary>Task RunningTask { get; set; }/// <summary>/// Initiator/// </summary>/// <param name="hour">The hour of the day to trigger</param>/// <param name="minute">The minute to trigger</param>/// <param name="second">The second to trigger</param>public DailyTrigger(int hour, int minute = 0, int second = 0){TriggerHour = new TimeSpan(hour, minute, second);CancellationToken = new CancellationTokenSource();RunningTask = Task.Run(async () => {while (true){var triggerTime = DateTime.Today + TriggerHour - DateTime.Now;if (triggerTime < TimeSpan.Zero)triggerTime = triggerTime.Add(new TimeSpan(24, 0, 0));await Task.Delay(triggerTime, CancellationToken.Token);OnTimeTriggered?.Invoke();}}, CancellationToken.Token);}/// <inheritdoc/>public void Dispose(){CancellationToken?.Cancel();CancellationToken?.Dispose();CancellationToken = null;RunningTask?.Dispose();RunningTask = null;}/// <summary>/// Triggers once every 24 hours on the specified time/// </summary>public event Action OnTimeTriggered;/// <summary>/// Finalized to ensure Dispose is called when out of scope/// </summary>~DailyTrigger() => Dispose();
}

然后像下面这样使用。

void Main()
{var trigger = new DailyTrigger(16); // every day at 4:00pmtrigger.OnTimeTriggered += () => {// Whatever};  Console.ReadKey();
}

点评区

思路是个好思路,不过在正式的项目开发中,建议还是用 Quartz.NET 或者 HangFire 这种专业的调度框架,毕竟它支持强大的 Cron 表达式。

RecurringJob.AddOrUpdate(() => MyMethod(), "* 16 * * *");

如何让 Timer 在特定时间点触发?相关推荐

  1. ajax定时器怎么写,js定时器怎么写?就是在特定时间执行某段程序

    js定时器怎么写?就是在特定时间执行某段程序 复制代码 代码如下: $(function(){ var handler = function(){ } var timer = setInterval( ...

  2. 【嵌入式系统开发15】STM32F103C8T6下通过定时器Timer方式实现时间的精准控制,实现串口通信并让LED等周期性地闪烁

    本文目的是主要介绍通过STM32F103C8T6采用定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务.请设置一个5秒的 ...

  3. pandas创建时间序列仿真数据并过滤(filter)时间数据:头尾数据、某年的数据、某年某月的数据、某年某月某日的数据、某个时间范围内的数据、truncate函数查看特定时间之前护着之后的数据

    pandas创建时间序列仿真数据并过滤(filter)时间数据:头尾数据.某年的数据.某年某月的数据.某年某月某日的数据.某个时间范围内的数据.truncate函数查看特定时间之前护着之后的数据 目录

  4. android在特定时间,如何在Android Oreo的特定时间在Android上发出通知?

    我正在寻找一种在"设置"中创建首选项的方法,以便在Android应用中的特定时间(由用户在设置中设置)发送通知.我看过像this这样的不同线程,但是这在Android Oreo中不 ...

  5. java 添加等待时间_Java中线程等待特定时间的最有效方法 - java

    我知道这个问题here,但是我有一个稍微不同的问题.如果我希望自己通过各种Thread方法(而不是通过实用程序类或Quartz)手动编码某个线程在特定时间的运行,那么最有效(就开销而言)进行编码. 我 ...

  6. 【Python】绘制GPX轨迹图并定位特定时间点

    使用GPS Logger移动版记录的GPX数据,以下是部分数据: <trk><name>轨迹 20230326-145338</name><trkseg> ...

  7. python pandas 怎么判断一天是否为工作日+计算距离特定时间之间的天数

    本文实现: ①计算距离特定时间之间的天数. ②时间是否为工作日. 准备数据: 数据采用的是一个平台的登录数据,包含登录的时间. 任务的要求是:选取用户最近的登录时间,同时判断距2020,6,18的天数 ...

  8. SAP-ABAP-查询特定时间生产订单状态-自建function

    在项目中经常遇见需要查询生产订单在具体某个时间是什么状态,但是标准的function都是查询当前状态的,在此写下一个function查询具体某个时间点生产订单状态 先看结果,下图为测试结果,没有问题 ...

  9. Android时间触发,设置闹钟管理器Android中的时间 - 立即触发闹钟

    这里我试图通过使用AlarmManger类设置闹钟.它与我工作正常,但当我设置闹钟时间后小时或分钟时间选择器,它会立即启动时,我保存该报警.闹钟.我需要警报熄灭,直到我设定时间. 下面是我的代码正在工 ...

最新文章

  1. 面试官 | Nginx 是什么?有什么作用?
  2. Mybatis 别名机制,自动扫描 数据的增删改
  3. 讯飞 tts 9.0 app_讯飞B1录音笔,到底值不值得买?
  4. 实现简单的Java内存缓存
  5. 华为状态栏图标替换_华为手机状态栏图标都是干嘛用的?华为手机图标含义大集合...
  6. libiconv移植
  7. 人工势场法matlab讲解,传统人工势场法(matlab)
  8. android官方原生主题,原生Android可以更换系统主题吗?
  9. java 二进制转图片_Java如何把二进制数据转换成图片???
  10. 训练集、测试集和验证集的作用
  11. html5 ios 键盘挡住输入框,IOS 键盘挡住输入框的问题解决办法
  12. pytorch池化maxpool2D注意事项
  13. 从 Angular Component 和 Directive 的实例化,谈谈 Angular forRoot 方法的命令由来
  14. simulink中MATLAB function模块数据维度不正确问题
  15. 面向对象-第一个代码模型
  16. Kubernetes 可扩展性简介
  17. [小说]魔王冢(16)寻凶(二)
  18. Java多线程+PDF生成实战(笔记)
  19. RT-Thread Studio使用笔记(五):I2C设备及AT24C256的使用
  20. bootBox 提示框插件

热门文章

  1. LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序
  2. 11G Oracle RAC添加新表空间时数据文件误放置到本地文件系统的修正
  3. Html5 Video 节点
  4. C# js调用winform方法,C# JS与winform通信
  5. Silverlight 2 应用程序部署到任意HTML页面
  6. 解决安装Weblogic domain卡住问题(Primeton BPS)
  7. 关于他们回答的 怎样在桌面建一个python GUI的快捷方式 这个问题
  8. hdu 4493 Tutor (水 精度)
  9. scss2css vscode设置_VSCode下让CSS文件完美支持SCSS或SASS语法方法
  10. office自定义安装选项_如何自定义Office 2013中功能区上的现有选项卡