前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[C#] .Net6新定时器PeriodicTimer

[C#] .Net6新定时器PeriodicTimer

作者头像
科控物联
发布于 2022-12-01 02:57:57
发布于 2022-12-01 02:57:57
2.5K01
代码可运行
举报
文章被收录于专栏:科控自动化科控自动化
运行总次数:1
代码可运行

.NET 中已经有五个其他计时器

  • System.Timers.Timer
  • System.Threading.Timer
  • System.Windows.Forms.Timer
  • System.Web.UI.Timer
  • System.Windows.Threading.DispatcherTimer

在.NET 6中引入了新Timer:System.Threading.PeriodicTimer,它和之前的Timer相比,最大的区别就是新的PeriodicTimer事件处理可以方便地使用异步,消除使用callback机制减少使用复杂度。

封装一个定时任务类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class BackgroundTask{
    private  Task? _timerTask;
    private readonly PeriodicTimer _timer;
    private readonly CancellationTokenSource _cts = new();
    public EventHandler dowork;
    public BackgroundTask(TimeSpan interval)
    {
        _timer = new PeriodicTimer(interval);
    }
    public void Start()
    {
        _timerTask = DoWorkAsync();
    }
    private async Task DoWorkAsync()
    {
        try
        {
            System.Console.WriteLine("开始定时任务");

            while (await  _timer.WaitForNextTickAsync(_cts.Token))
            {

                dowork?.Invoke(null,null);
            }

        }
        catch(OperationCanceledException ex){
            Console.WriteLine(ex.Message);
        }

    }
    public async Task StopAsync()
    {
        if  (_timerTask is null)
        {
            return;
        }
        _cts.Cancel();
        await _timerTask;
        _cts.Dispose();
        System.Console.WriteLine("取消定时任务");
    }
}

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
XTrace.WriteLine(  "按任意键开始Task");
Console.ReadKey();
var task = new BackgroundTask(TimeSpan.FromMilliseconds(1000));
task.dowork += (sender,e)=> {
    XTrace.WriteLine("PeriodicTimer 任务。。。");
};
task.Start();
XTrace.WriteLine("按任意键结束Task");
Console.ReadKey();

PeriodicTimer的设计优势,

API 仅对重复触发的计时器有意义,触发一次的计时器可能是基于任务的(我们已经为此提供了 Task.Delay)。 计时器将在用户代码执行时暂停,并在结束后恢复下一个时间段。 可以使用提供的取消令牌停止计时器以停止枚举。 不会捕获执行上下文。

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

本文分享自 科控物联 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
.NET中有多少种定时器
.NET中至少有6种定时器,每一种定时器都有它的用途和特点。根据定时器的应用场景,可以分为UI相关的定时器和UI无关的定时器。本文将简单介绍这6种定时器的基本用法和特点。
czwy
2023/11/29
2730
C#多线程(12):线程池
线程池全称为托管线程池,线程池受 .NET 通用语言运行时(CLR)管理,线程的生命周期由 CLR 处理,因此我们可以专注于实现任务,而不需要理会线程管理。
痴者工良
2021/04/26
1.5K0
C# 定时器详解
System.Threading.Timer 是 .NET 中的基础定时器,其它定时器都是基于此做的封装。
Power
2025/04/01
860
C#实现定时器的几种方案
前几天写了一篇java的定时器方案,应小伙伴的要求,今天这里一下c#实现定时器的方案。
用户4831957
2019/10/31
18.1K0
PeriodicTimer
在现代应用程序开发中,定时任务是一个常见需求。无论是定期获取数据、执行后台任务,还是刷新界面,定时器都是必不可少的工具。.NET 6 引入了一个新的定时器类——PeriodicTimer,它为开发者提供了一种简单而高效的方法来处理周期性任务。在这篇博客中,我们将了解PeriodicTimer,并展示如何在实际应用中使用它。
JusterZhu
2025/01/23
740
PeriodicTimer
C# 三个Timer
Timer 计时器是在C#开发中经常用到的,但是有很多开发人员对他并不了解,今天这篇文将我们就具体讲解一下C#中的计时器。
喵叔
2020/09/08
1.8K0
C# 三个Timer
C# 多线程九之Timer类
相信写过定时任务的小伙伴都知道这个类,非常的轻量级,而且FCL中大量的类使用了这个方法,比如CancellationTokenSource的CancelAfter就是用Timer去做的.
郑小超.
2018/12/26
9000
C#各种定时器Timer类的区别与使用介绍
本文介绍下,C#中的各种定时器Timer,介绍它们之间的区别,通过具体的例子学习其使用方法。有需要的朋友,可以参考下。
zls365
2020/08/19
3.7K0
C#多线程(13):任务基础①
.NET 中,有三种异步编程模式,分别是基于任务的异步模式(TAP)、基于事件的异步模式(EAP)、异步编程模式(APM)。
痴者工良
2021/04/26
9620
最全C#线程查漏补缺
在单核计算机中,CPU 是独占的,内存是共享的,这时候运行一个程序的时候是没有问题。但是运行多个程序的时候,为了不发生一个程序霸占整个 CPU 不释放的情况(如一个程序死循环无法结束了,那么其他程序就没有机会运行了),就需要开发者给不同程序划分不同的执行时间。为了避免不同程序之间互相操作数据或代码,导致程序被破坏的情况,就需要开发者给程序划分独立的内存范围。也就是程序需要开发者进行调度以及和划分独立的内存空间。
郑子铭
2023/08/30
2820
最全C#线程查漏补缺
谈谈C#中各种线程的使用及注意项~
接下来我们就来学习一下 timer 吧,摇摇脑袋,清醒一下,接下来开始学习....
用户7053485
2020/06/19
2K0
C#多线程(14):任务基础②
上一篇,我们学习了任务的基础,学会多种方式场景任务和执行,异步获取返回结果等。上一篇讲述的知识比较多,这一篇只要是代码实践和示例操作。
痴者工良
2021/04/26
7400
WPF一步一脚印系列(1):万事起头难
  一直从事Asp.Net的开发,而C/S的开发方面简直是一片空白,于是从上星期开始就痛下决心开始学习WPF。我采取的策略是网上看基础资料+做简单的demo练习+网上查资料。从csdn上下了个比较不错的基础讲解文档,花了几天时间终于把它看完,算是有个基本了解吧,今天开始写些小练习。   这个系列主要是用来记录自己学习WPF的心路历程,以实例为主配合原理和注意点的说明,有纰漏之处请大家多多指正!!^_^ 实例1——倒计算器                                            
^_^肥仔John
2018/01/18
8800
WPF一步一脚印系列(1):万事起头难
.NET 6新东西--PeriodicTimer
在.NET 6中引入了新Timer:System.Threading.PeriodicTimer,它和之前的Timer相比,最大的区别就是新的PeriodicTimer事件处理可以方便地使用异步,消除使用callback机制减少使用复杂度。讲解PeriodicTimer之前我们先来看以下该怎么使用它:
喵叔
2021/12/06
4790
C#3种常见的定时器(多线程)
总结以下三种方法,实现c#每隔一段时间执行代码: 方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间; 方法二:使用System.Timers.Timer类; 方法三:使用System.Threading.Timer; using System; using System.Collections; using System.Threading; public class Test { public static void Main() { T
zls365
2020/08/19
3.8K0
C#异步使用要点(翻译)
在使用异步方法中最好不要使用void当做返回值,无返回值也应使用Task作为返回值,因为使用void作为返回值具有以下缺点
莫问今朝
2018/11/05
3.5K0
6搞懂线程池(二)
抱歉各位多线程专栏托更这么久,这篇文章我们继续讲线程池的相关知识,其中将涉及到如下知识:
喵叔
2020/09/08
5090
解决一个C#中定时任务被阻塞问题
链接:cnblogs.com/JerryMouseLi/p/15543495.html
郑子铭
2021/12/01
8420
解决一个C#中定时任务被阻塞问题
[C#]多线程定时器
System.Threading.Timer是最简单的多线程定时器:它只有一个构造器和两个方法(尤其适合于像作者这样的极简主义者!)。在接下来的例子中,定时器会在第一个五秒钟结束后调用Tick方法,并输出“tick…”。而后每一秒钟调用一次Tick方法,直至用户按下回车键:
科控物联
2022/03/29
1K0
[C#]多线程定时器
.NET分布式Orleans - 4 - 计时器和提醒
与标准的 .NET System.Threading.Timer 类相似,Orleans 的 Timer 允许在一段时间后执行特定的操作,或者在特定的时间间隔内重复执行操作。
Chester Chen
2024/03/26
1350
.NET分布式Orleans - 4 - 计时器和提醒
相关推荐
.NET中有多少种定时器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验