文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

.NET6新特性试用Timer类之PeriodicTimer

2024-04-02 19:55

关注

前言:

在.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 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯