返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.NET6新特性试用Timer类之PeriodicTimer
  • 872
分享到

.NET6新特性试用Timer类之PeriodicTimer

2024-04-02 19:04:59 872人浏览 安东尼
摘要

目录前言:一、Demo结论:前言: 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.W

前言:

在.NET中,已经存在了5个Timer类:

System.Threading.Timer
System.Timers.Timer
System.WEB.UI.Timer
System.windows.FORMs.Timer
System.Windows.Threading.DispatcherTimer

不管以前这样设计的原因,现在.NET 6又为我们增加了一个新Timer,​​PeriodicTimer​​。

这又是为什么呢?

一、Demo

与其他Timer需要创建事件回调不同:

Timer timer = new Timer(delegate
{
    Thread.Sleep(3000);
    Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");
    Console.WriteLine($"{DateTime.Now.Second} Timer tick");
},null,0,1000
);

PeriodicTimer的使用方式如下:

//间隔时间1秒
using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1)))
{
    //在到达指定周期后执行方法
    while (await timer.WaitForNextTickAsync())
    {
        await Task.Delay(3000);
 
        Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}");
        Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");
    }
}

​从​​await​​关键字可以看出,PeriodicTimer用于异步执行;并且一次只有一个线程可以执行。

另外,你可以控制​停止PeriodicTimer计时​。示例代码如下:

//创建CancellationTokenSource,指定在3秒后将被取消
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3));

using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1)))
{
    while (await timer.WaitForNextTickAsync(cts.Token))
    {
        Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");
    }
}

需要注意的是,这会引发​​OperationCancelled​​异常,你需要捕获该异常,然后根据需要进行处理:

当然,你也可以通过主动取消CancellationTokenSource,来停止PeriodicTimer计时,

示例代码如下:

var cts = new CancellationTokenSource();

using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1)))
{
    int count = 0;
    while (await timer.WaitForNextTickAsync(cts.Token))
    {
        if (++count == 3)
        {
            //执行3次后取消
            cts.Cancel();
        }
        Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");
    }
}

这次换成了​​TaskCancelled​​异常:

如果,你不想抛出异常,则可以用PeriodicTimer.Dispose方法来停止计时,

示例代码如下:

using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1)))
{
    int count = 0;
    while (await timer.WaitForNextTickAsync())
    {
        if (++count == 3)
        {
            //执行3次后取消
            timer.Dispose();
        }
        Console.WriteLine($"{DateTime.Now.Second} PeriodicTimer tick");
    }
}

结论:

通过上面的代码,可以了解到,设计PeriodicTimer的原因,可以归结为:

  • 用于异步上下文
  • 一次仅由一个消费者使用​

 到此这篇关于.net 6新特性试用Timer类之PeriodicTimer 的文章就介绍到这了,更多相关Timer类之PeriodicTimer 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: .NET6新特性试用Timer类之PeriodicTimer

本文链接: https://lsjlt.com/news/139152.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • .NET6新特性试用Timer类之PeriodicTimer
    目录前言:一、Demo结论:前言: 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.W...
    99+
    2024-04-02
  • .NET6新特性之隐式命名空间引用
    早在 .NET 6 Preview 7版本中微软就已经引入隐式命名空间引用。在.NET Preview 7这个版本中这个功能是默认开启的,如果需要禁用它的化就需要配置Disable...
    99+
    2024-04-02
  • .NET 6新特性试用之DateOnly和TimeOnly类型
    目录前言:举例​1.创建实例​​2.类型转换​​3.操作​结论:前言: 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟)。 虽然...
    99+
    2024-04-02
  • .NET 6新特性试用之TryGetNonEnumeratedCount 方法
    目录前言:一、举例二、原理结论:前言: .NET 6新增了​​TryGetNonEnumeratedCount​​方法,计算可枚举类型的元素总数。 LINQ不是已经有了​​Count...
    99+
    2024-04-02
  • C#新特性之可空引用类型
    安装 您必须下载Visual Studio 2017 15.5预览版(目前最新发布版本是15.4),下载地址:https://www.visualstudio.com/en-us/n...
    99+
    2024-04-02
  • .NET 6新特性试用之Nuget包验证
    目录前言:Demo结论:前言: 我们常常需要将.NET类库打包成Nuget包,以便多个项目公用。 一旦修改类库,​尽管代码可以运行​,并成功打包成新版本​,看起来一切正常​,​但是​...
    99+
    2024-04-02
  • .NET 6新特性试用之System.Text.Json功能改进
    目录前言:Demo​1.属性排序​​2.序列化通知​结论:前言: ​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中...
    99+
    2024-04-02
  • .NET 6新特性试用之常量内插字符串
    目录前言:常量内插字符串结论:前言: 编写代码时,我们常常需要组合字符串。 如下代码: string scheme = "https"; string host = "xxx.com...
    99+
    2024-04-02
  • Java8新特性之线程安全日期类
    目录LocalDateTimeSimpleDateFormat线程不安全SimpleDateFormat如何保证线程安全Java8全新的日期和时间APILocalDateLocalT...
    99+
    2024-04-02
  • php7新特性之返回类型声明的使用案例
    这篇文章主要介绍了php7新特性之返回类型声明的使用案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。突然感觉,php逐渐走向强类型语言了,和java、c++这类强类型语言有...
    99+
    2023-06-14
  • 深入理解Java8新特性之Optional容器类的应用
    1.Optional容器类 Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,...
    99+
    2024-04-02
  • Java8新特性Optional类怎么应用
    这篇“Java8新特性Optional类怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java8新特性Optiona...
    99+
    2023-06-29
  • ES6新特性之类和继承的示例分析
    这篇文章主要介绍了ES6新特性之类和继承的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、类(Class)1.基本语法JavaSc...
    99+
    2024-04-02
  • C++11新特性之四种类型转换cast说明
    目录引言1、static_cast1.1 基本类型转换1.2 类的上行转换(安全)1.3 类的下行转换(不安全)2、const_cast2.1 改变常量属性3、dynamic_cas...
    99+
    2023-02-09
    c++11类型转换 c++11类型转换cast C++类型转换
  • Go1.18新特性之泛型怎么使用
    本篇内容主要讲解“Go1.18新特性之泛型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go1.18新特性之泛型怎么使用”吧!01 Go中的泛型是什么众所周知,Go是一门静态类型的语言。...
    99+
    2023-06-30
  • Java8新特性之重复注解与类型注解详解
    目录Java8新特性重复注解与类型注解一、JDK5中的注解1.注解(@)2.作用3.如何理解注解?4.关于注解5.注解分为三个阶段6.注解的属性类型7.为注解增加属性二、Java8中...
    99+
    2024-04-02
  • php7新特性之标量类型声明的案例分析
    这篇文章主要介绍php7新特性之标量类型声明的案例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!PHP7增加了标量类型声明的特性,标量类型声明有两种模式   :强制模式(默认)严格模式   &...
    99+
    2023-06-14
  • Java8新特性之Lambda表达式的使用
    目录1. lambda表达式介绍2. lambda表达式的重要特征3. lambda表达式对域外变量的限制4. lambda表达式的优缺点5. lambda表达式的使用场景1. la...
    99+
    2024-04-02
  • Mysql 5.7 新特性之 json 类型的增删改查操作和用法
    目录插入数据 :insert操作更新记录:update 追加内容: 更新记录:追加内容到数组:更新记录:update 修改json属性: 删除记录: 查询记录:扩展: 一...
    99+
    2024-04-02
  • Mysql 5.7 新特性之 json 类型的增删改查操作和用法
    目录插入数据 :insert操作更新记录:update 追加内容: 更新记录:追加内容到数组:更新记录:update 修改json属性: 删除记录:&n...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作