在C#中使用 System.Threading.Timer 实现定时任务 (qq.com)

前言

在编写应用程序过程中,高效的任务调度都是必不可少的,无论是在实现后台服务、自动化任务或者定期数据处理。在.NET中,System.Threading.Timer 类提供了一种强大而简单的方法来计划任务以特定时间间隔运行。本文将介绍如何使用System.Threading.Timer实现有效地处理周期性和延迟任务。

计时器

System.Threading.Timer 类是线程命名空间的一部分。使用它,允许我们按指定的时间间隔执行回调方法。这个计时器与其它计时器机制不同,System.Threading.Timer 使用线程池线程来执行回调,使其适用于不需要精确计时的周期性任务。

1、了解关键概念

时间间隔(period):每次执行回调方法的时间间隔(单位:毫秒);到期时间(dueTime):计时器初始化后,延迟多少时间(单位:毫秒)执行回调方法;方法参数(state):传递给回调方法的可选参数,用于传递其他信息;回调方法(Callback):要定期执行的方法,实际执行任务内容;

2、使用步骤

首先,创建计时器1、定义回调方法2、初始化 Timer 实例的到期时间、时间间隔、  回调方法及方法参数。其次,启动计时器计时器在创建时自动启动。然后,释放计时器正确处理计时器,释放不再需要的资源。

3、更改计时器间隔

使用Change方法更新到期时间或期间。

// 到期时间5秒和时间间隔2分钟
timer.Change(TimeSpan.FromSeconds(5),TimeSpan.FromMinutes(3));
 

4、停止计时器:

通过使用Change方法将到期时间和时间段设置为超时,实现无限停止计时器。或使用Dispose方法释放计时器资源,实现停止计时器。

// 将到期时间和时间段设置为超时
timer.Change(Timeout.Infinite, Timeout.Infinite);
// 释放计时器资源
timer.Dispose();
 

基本示例

如何使用 System.Threading.Timer 每分钟执行一次任务。

namespace Fountain.WinConsole.OtherDemo
{
internal class Program
{
// 声明计时器
private static Timer timer;
/// <summary>
/// 程序入口
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//创建一个计时器,在初始延迟为1秒后每1分钟执行回调方法一次
timer = new Timer(CallbackConsole, null, 1000, 60000);
// 等待输入回车退出
Console.WriteLine("按[Enter]退出。");
// 等待接收输入
Console.ReadLine();
}
/// <summary>
///
/// </summary>
/// <param name="state">回调方法参数</param>
private static void CallbackConsole(object state)
{
try
{
Console.WriteLine($"执行方法时间: {DateTime.Now}");
}
catch (Exception exception)
{
Console.WriteLine(exception.ToString());
}
}
}
}

  

 

事项

1、回调方法执行的最小化耗时:  较小化耗时以避免阻塞线程池线程,如果是冗长的操作,则不建议使用。
2、处理异常:确保捕获并处理回调方法中的异常,因为未经处理的异常可能会终止应用程序。3、避免重叠执行:确保回调方法在下次调用之前完成。

小结

以上是System.Threading.Timer实现定时任务的内容,通过了解其使用,我们可以有效地管理周期性、延迟任务,优化资源使用,并确保应用程序平稳运行。希望本文能为大家有所帮助,如有不到之处,请多多包涵

在C#中使用 System.Threading.Timer 实现定时任务的更多相关文章

  1. .NET中System.Diagnostics.Stopwatch、System.Timers.Timer、System.Threading.Timer 的区别

    1.System.Diagnostics.Stopwatch Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间. 在典型的 Stopwatch 方案中,先调用 ...

  2. System.Threading.Timer 定时器的用法

    System.Threading.Timer 是C# 中的一个定时器,可以定时(不断循环)执行一个任务.它是在线程上执行的,具有很好的安全性.为此  .Net Framework 提供了5个重载的构造 ...

  3. System.Threading.Timer使用心得

    System.Threading.Timer 是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高. "只要在使用 Timer,就必须保留对它的引用."对于任何托 ...

  4. System.Threading.Timer的使用技巧

    转自:http://www.360doc.com/content/11/0812/11/1039473_139824496.shtml# System.Threading.Timer timer = ...

  5. System.Threading.Timer如何正确地被Dispose

    System.Threading.Timer是.NET中一个定时触发事件处理方法的类(本文后面简称Timer),它背后依靠的是.NET的线程池(ThreadPool),所以当Timer在短时间内触发了 ...

  6. System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的 区别和用法

    System.Windows.Forms.Timer执行的时候,如果你在过程中间加一个sleep整个的界面就死掉了,但是另外两个没有这个情况,System.Timers.Timer.System.Th ...

  7. 当时钟事件声明为过程变量 让system.threading.timer时钟失效

    这个项目的小模块就是画label 控件到tablepayoutpanel表单 之中, 中间用到了时钟,事件(带返回值的),哈希表 .由于时钟定义在 form1的启动构造函数中导致了form1,启动完毕 ...

  8. c# 多线程之-- System.Threading Timer的使用

    作用:每隔多久去执行线程里的方法. class ThreadTimerDemo { static void Main(string[] args) { // Create an AutoResetEv ...

  9. 定时器:Timer:System.Threading.Timer类(转)

    最近的一个项目有一些地方需要用到定时功能,在设计过程中,突然发现.net的Timer类居然还有很多我以前没有用过的功能,这里就跟大家分享一下 注:这里的Timer类特指System.Threading ...

  10. System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用

    System.Windows.Forms.Timer.System.Timers.Timer.System.Threading.Timer的 区别和用法http://space.itpub.net/1 ...

随机推荐

  1. panic: qtls.ConnectionState not compatible with tls.ConnectionState

    问题重现 之前一个 go-micro 1.18 的项目 执行 go run main.go 命令时出现以下报错 go run main.go panic: qtls.ConnectionState n ...

  2. Readers and Writers JSON Framework(2)

    我们关心json的读写.特别在datasnap中,关于使用stream更是显得重要.其实轮子都帮你做好了,你不知道整经再研究就是一个悲哀.除非你要研究. 回正题: 处理json有二套框架. JSON ...

  3. 解决 Maven 打包项目中 Excel 文件乱码问题

    在 Java 项目开发过程中,我们常常会使用 Maven 来管理项目依赖和进行项目打包.当涉及到使用 Freemarker 导出 Excel 文件时,不少开发者可能会遇到一个让人头疼的问题 --Exc ...

  4. PC端自动化测试实战教程-2-pywinauto 启动PC端应用程序 - 上篇(详细教程)

    1.简介 经过上一篇的学习.介绍和了解,想必小伙伴或者童鞋们,已经见识到pywinauto的强大了,今天继续介绍pywinauto,上一篇已经可以打开计算器了,这里宏哥在提供其他方法进行打开计算器和非 ...

  5. MySQL 中 EXISTS 和 IN 的区别是什么?

    在 MySQL 中,EXISTS 和 IN 都用于在子查询中进行条件判断,但它们的使用场景和性能有一定区别.以下是 EXISTS 和 IN 的主要区别: 1. 功能和用法 EXISTS: EXISTS ...

  6. 漏洞预警 | CraftCMS模板注入漏洞

    0x00 漏洞编号 CVE-2024-56145 0x01 危险等级 高危 0x02 漏洞概述 CraftCMS是一个灵活的.易于使用的内容管理系统. 0x03 漏洞详情 CVE-2024-56145 ...

  7. vue3 学习-初识体验-常见指令v-for和v-model

    继续通过小案例来体验一些常用的指令, 以经典的todolist进行展示. 首先呢通过 v-for 指令进行dom循环. v-for 通常是在循环dom的编写的同时遍历数据进行填充. <!DOCT ...

  8. 操作系统:设备I/O -- 如何在内核中注册设备?

    在上节课里,我们对设备进行了分类,建立了设备与驱动的数据结构,同时也规定了一个驱动程序应该提供哪些标准操作方法,供操作系统内核调用.这相当于设计了行政部门的规章制度,一个部门叫什么,应该干什么,这些就 ...

  9. #React中类组件中关于回调函数的一个问题

    在ES6中,类中定义的方法,是放在原型对象的,供实例对象引用. //创建一个Person类 class Person { constructor(name,age) { this.name = nam ...

  10. 初次使用 Jetbrains Rider 编写 C#(.Net) 代码

    前段时间,Jetbrains公司 公布了 Rider IDE 对非商业用途免费,看到很多业界的朋友都用到这个IDE,今天便下载下来使用一下. 1.界面的差异 Rider的界面跟我前段时间学习调试安卓代 ...