首页 > 编程语言 >在C#中使用 System.Threading.Timer 实现定时任务

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

时间:2024-08-04 09:50:04浏览次数:14  
标签:C# System Timer Threading 计时器 回调 方法

在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,Timer,Threading,计时器,回调,方法
From: https://www.cnblogs.com/LuoCore/p/18341477

相关文章

  • CVE-2023-26469 复现
    题目描述:Jorani是一款开源的员工考勤和休假管理系统,适用于中小型企业和全球化组织,它简化了员工工时记录、休假请求和审批流程,并提供了多语言支持以满足不同地区的需求。在Jorani1.0.0中,攻击者可以利用路径遍历来访问文件并在服务器上执行代码。这是一个csrf的洞,找了一下,......
  • Nessus Professional 10.8.0 Auto Installer for macOS Sonoma
    NessusProfessional10.8.0AutoInstallerformacOSSonoma发布Nessus试用版自动化安装程序,支持macOSSonoma、RHEL9和Ubuntu24.04请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-macos/,查看最新版。原创作品,转载请保留出处。Nessus简介Nessus漏......
  • COMP3301 Return of the Sys
    COMP3301Assignment1OpenBSDZones“Episode3:ReturnoftheSys(call)”Due:3pmMondayinWeek5(19thofAugust)1AcademicIntegrityAllassessmentsareindividual.YoushouldfeelfreetodiscussaspectsofCprogrammingandassessmentspecifications......
  • 一款简而轻的低侵入式在线构建、自动部署、日常运维监控软件,一键安装脚本,支持多种cao
    前言在当今快速发展的软件开发领域,开发团队经常面临一系列运维挑战。没有专业运维人员的支持,开发人员不得不承担构建和部署项目的任务。面对不同项目的构建和部署命令,以及多环境的打包需求,开发人员需要一个能够简化这些流程的解-决方案。同时,监控多个项目的运行状态、远程连......
  • 推荐一个基于 Spring boot 的后台管理框架,前后端分离,可快速开发OA、CMS网站后台管理,简
    前言在当前的软件开发领域,后台管理系统的需求量巨大,但许多团队在开发过程中面临诸多挑战。常见的痛点包括开发效率低下、系统不够灵活、缺乏统一的异常处理和日志记录,以及难以实现的权限控制等。此外,许多项目在技术选型上存在局限性,导致难以适应多变的业务需求。针对这些现状,......
  • C++ //练习 16.27 对下面每条带标签的语句,解释发生了什么样的实例化(如果有的话)。如果
    C++Primer(第5版)练习16.27练习16.27对下面每条带标签的语句,解释发生了什么样的实例化(如果有的话)。如果一个模板被实例化,解释为什么;如果未实例化,解释为什么没有。template<typenameT>classStack{};voidf1(Stack<char>); //(a)classExercise{ Stack<dou......
  • 前端必知必会-HTMLCanvas图形
    文章目录HTMLCanvas图形添加JavaScript绘制一条线绘制一个圆圈绘制一个文本描边文本绘制线性渐变绘制圆形渐变绘制图像总结HTMLCanvas图形HTML<canvas>元素用于在网页上绘制图形。什么是HTMLCanvas?HTML<canvas>元素用于通过JavaScript动态绘制图形......
  • rocksdb安装与使用
    首先要安装gcc7.3以上版本,依赖于c++17.参见gcc7安装及4.8.5和7.5并存。需要rpm方式或源码安装gflags2.2,否则系统可能内置了gflags2.1,从而导致链接时一直找不到gflags库。如下:/tmp/ccUXmr9R.o:Infunction`__static_initialization_and_destruction_0(int,int)':/home/......
  • c动态加载c/c++ so并调用其中的函数或者子类实现
    在不少服务器应用中,会采用插件化或者模块化的体系实现具体的业务功能,比如mysql支持插件化体系,nginx采用模块化体系。总得来说,很多时候,因为扩展性,系统会采用动态加载so的方式扩展业务功能,而主框架不需要每次新增功能就不得不重新编译,很多时候,对于二进制发行的应用来说,不可能这......
  • UI界面设计-Fer2013面部表情识别/基于pytorch
    基于tensorflow代码请参考主页:http://t.csdnimg.cn/beYP5http://t.csdnimg.cn/beYP5本文使用torch框架构建模型做出UI界面,将所有调参变量做到UI界面上一、项目概述本项目开发了一款集成深度学习的情绪识别软件,采用PyTorch框架构建卷积神经网络模型。该软件通过摄像头捕获......