如何让 Timer 在特定时间点触发?

咨询区

  • 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 * * *");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析Android系统

深入剖析Android系统&#xff08;基于Google发布的Jelly Bean原始代码&#xff0c;讲述Android系统的内部静态结构关系和内部运行机制&#xff0c;为你呈现原汁原味的Android代码分析大餐&#xff01;&#xff09; 杨长刚著 ISBN 978-7-121-19374-3 2013年1月出版 定价&#xf…

微博上的网红,为什么更能红得发紫?

“网红”是最近非常热潮的互联网现象。在微博上&#xff0c;各种各样的网红不仅活跃了粉丝群体&#xff08;微博月活跃用户增至2.61亿&#xff09;&#xff0c;也为微博增添了互动热度&#xff08;微博一季度微博日均视频播放量达4.7亿次&#xff0c;同比增长489%&#xff0c;比…

TotoiseSVN-小乌龟的使用方法总结

原文转自 http://www.cnblogs.com/xilentz/archive/2010/05/06/1728945.html 收藏起来用的时候比较方便 TotoiseSVN的基本使用方法在 项目管理实践教程一、工欲善其事&#xff0c;必先利其器【Basic Tools】中&#xff0c;我已经讲解了怎样安装TortoiseSVN。在上面的讲解中已经…

UNIX环境高级编程笔记

1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len); SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务&#xff1a; 一.SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知的端口&#xff0c;即使以前建立的将该端口用作它们的本地端口的连接仍存在。 …

linux重定向输出时加时间变量,shell 重定向错误输出到文件 加上时间(标明错误抛出的时间)...

在开发中&#xff0c;我们避免不了写crontab脚本来异步执行一些东西&#xff0c;一般设置crontab用下面的方法&#xff1a;*/1 * * * * commond > /tmp/t.log 2>&1前面的> /tmp/t.log代表把标准输出重定向到/tmp/t.log文件&#xff0c;后面的 2>&1 代表把标…

ping

一、Linux下的ping参数 ping [ -d] [ -D ] [ -n ] [ -q ] [ -r] [ -v] [ \ -R ] [ -a addr_family ] [ -c Count ] [ -w timeout ] [ -f | -i \ Wait ] [ -l Preload ] [ -p Pattern ] [ -s PacketSize ] [ -S hostname/IP addr ] \ [ -L ] [ - I a.b.c.d. ] [ -o interface ] …

WPF DataGrid 如何将被选中行带到视野中

WPF DataGrid 如何将被选中行带到视野中目录前言准备工作方法一方法二总结独立观察员 2021 年 12 月 11 日前言在 WPF 开发中&#xff0c;显示表格一般使用 DataGrid 控件&#xff0c;而且我们一般会依据用户的选中行的操作来执行一些逻辑&#xff0c;这种情况&#xff0c;选中…

Python 基础语法_Python脚本文件结构

前言 Python基础语法这一章&#xff0c;主要记录了Python的文件结构、逻辑运算符、算术操作符、控制流语句、输入和输出语句、函数、对象、类等方面的内容。在了解了Python的数据类型之后&#xff0c;结合之前的要点来一起继续学习。 软件环境 系统 UbuntuKylin 14.04软件 Pyth…

Andriod之import android.support.v4或者import android.support.v7提示导入错误解决办法

问题所在原因&#xff1a;少了v4.jar包 解决办法&#xff1a;给项目添加v4.jar包就行 在使用Eclipse开发andriod程序时&#xff0c;程序中提示import android.support.v4.XXX或者import android.support.v7.XXX出错&#xff0c;具体的提示信息是&#xff1a; The import andro…

e2200网卡驱动 linux,Linux驱动修炼之道-驱动中一些常见的宏

Linux驱动修炼之道-驱动中一些常见的宏努力成为linux kernel hacker的人李万鹏原创作品&#xff0c;为梦而战。转载请标明出处http://doc.xuehai.net/woshixingaaa/archive/2011/06/02/6462065.aspx本文档讲解一下驱动中常用的宏&#xff0c;下边一个一个来说&#xff0c;先声明…

一对经典的时间获取客户/服务器程序

前言 本文通过一对经典的时间获取客户/服务器程序&#xff0c;展现了Linux网络编程的大体框架&#xff0c;为以后更深入的学习打下基础。 客户服务器模式网络编程的大体框架 客户端代码 1 #include <stdio.h>2 // 下头文件包含socket(), bind()等套接字通信必须的函数。3…

SkyWalking8.1.0 部署和使用

一、简介1、官方文档https://github.com/apache/skywalking/tree/master/docs2、功能SkyWalking是一个可观测性分析平台和应用性能管理系统&#xff0c;提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案&#xff0c;并支持多种开发语言。专为微服务、云原生架…

CGI编程学习

一&#xff0e;基本原理 CGI&#xff1a;通用网关接口&#xff08;Common Gateway Interface&#xff09;是一个Web服务器主机提供信息服务的标准接口。通过CGI接口&#xff0c;Web服务器就能够获取客户端提交的信息&#xff0c;转交给服务器端的CGI程序进行处理&#xff0c;最…

博古通今的孩子是怎么养成的?答案就在这本影响了无数中国人思想的奇书里……

▲ 点击查看“三十六计走为上计”这句话&#xff0c;相信是大家从小听到大的俗语了。除此之外&#xff0c;还有“抛砖引玉”、“顺手牵羊”、“借刀杀人”、“擒贼先擒王”等都出自经典兵书《三十六计》。《三十六计》是中国古代最伟大的兵法谋略书之一&#xff0c;集智慧韬略、…

jmeter(2)录制脚本

Jmeter脚本是以JMX格式为主 Jmeter也是支持录制的&#xff0c;支持第三方录制方式和代理录制方式。 1、第三方录制主要是通过badboy来录制&#xff0c;录制后另存为jmx格式即可。 2、Jmeter也有自己的代理&#xff0c;录制脚本前&#xff0c;我们只要启动好代理&#xff0c;手动…

Android之Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE问题解决

Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE 晚上在测一个widget,前面测的好好的,后面再安装的时候发现如下错误: [2009-06-07 02:39:35 - battery] Performing sync [2009-06-07 02:39:35 - battery] Automatic Target Mode: using device HT843GZ03305 [2009…

linux硬盘转windows7,记——第一次上手UEFI电脑,将mbr硬盘的Windows7和Linux转为gpt+uefi启动...

这是篇日记&#xff0c;前面有大量的个人情绪&#xff0c;要看方法的请直接看后面。--------------------------------------------------------------------------------------------我终于上手新电脑了虽然还是用别人的旧电脑但是总算能够用上近代一点的硬件了&#xff0c;可…

20 个 .NET 6 新增的 API

DateOnly & TimeOnly.NET 6 引入了两种期待已久的类型 - DateOnly 和 TimeOnly, 它们分别代表DateTime的日期和时间部分。DateOnly dateOnly new(2021, 9, 25);Console.WriteLine(dateOnly);TimeOnly timeOnly new(19, 0, 0);Console.WriteLine(timeOnly); DateOnly date…

中国学生的最大噩梦,都来源于这个男人

全世界只有3.14 % 的人关注了爆炸吧知识会通中西经世致用说到中国古代的“全才”&#xff0c;一般人都会脱口而出沈括、张衡、祖冲之....而在明朝&#xff0c;有这么一位少有人知的“全才”式科学家&#xff0c;他的研究领域包括天文、历法、数学、军事、农业、水利....和上述的…