C#精准定时

  • 博主写作不容易,孩子需要您鼓励
  • 万水千山总是情 , 先点个赞行不行

简介

我们在自动化上位机编写过程中,上位机的定时应用在很多地方。对于工业上位机程序设计起到非常关键的作用,比如:评估算法耗时;动作延时等等。

那我们如何实现这一功能呢?C#为我们提供了一个StopWatch定时器,我们可以借助此定时器进行定时。

有的人可能会问,为什么不用Sleep,因为这种延时方法定时精度差,并且会卡死线程与程序。最主要的是定时精度差

StopWatch类

StopWatch类定义如下:

namespace System.Diagnostics  
{  
    //  
    // 摘要:  
    //     提供一组方法和属性,可用于准确地测量运行时间。  
    public class Stopwatch  
    {  
        //  
        // 摘要:  
        //     获取以每秒计时周期数表示的计时器频率。此字段为只读。  
        public static readonly long Frequency;  
        //  
        // 摘要:  
        //     指示计时器是否基于高分辨率性能计数器。此字段为只读。  
        public static readonly bool IsHighResolution;  
  
        //  
        // 摘要:  
        //     初始化 System.Diagnostics.Stopwatch 类的新实例。  
        public Stopwatch();  
  
        //  
        // 摘要:  
        //     获取当前实例测量得出的总运行时间。  
        //  
        // 返回结果:  
        //     一个只读的 System.TimeSpan,用于表示当前实例测量得出的总运行时间。  
        public TimeSpan Elapsed { get; }  
        //  
        // 摘要:  
        //     获取当前实例测量得出的总运行时间(以毫秒为单位)。  
        //  
        // 返回结果:  
        //     一个只读长整型,表示当前实例测量得出的总毫秒数。  
        public long ElapsedMilliseconds { get; }  
        //  
        // 摘要:  
        //     获取当前实例测量得出的总运行时间(用计时器计时周期表示)。  
        //  
        // 返回结果:  
        //     一个只读长整型,表示当前实例测量得出的计时器计时周期的总数。  
        public long ElapsedTicks { get; }  
        //  
        // 摘要:  
        //     获取一个指示 System.Diagnostics.Stopwatch 计时器是否在运行的值。  
        //  
        // 返回结果:  
        //     如果 System.Diagnostics.Stopwatch 实例当前正在运行,并且在对某个时间间隔的运行时间进行测量,则该值为 true;否则为 false。  
        public bool IsRunning { get; }  
  
        //  
        // 摘要:  
        //     获取计时器机制中的当前最小时间单位数。  
        //  
        // 返回结果:  
        //     一个长整型,表示基础计时器机制中的计时周期计数器值。  
        public static long GetTimestamp();  
        //  
        // 摘要:  
        //     对新的 System.Diagnostics.Stopwatch 实例进行初始化,将运行时间属性设置为零,然后开始测量运行时间。  
        //  
        // 返回结果:  
        //     刚刚开始测量运行时间的 System.Diagnostics.Stopwatch。  
        public static Stopwatch StartNew();  
        //  
        // 摘要:  
        //     停止时间间隔测量,并将运行时间重置为零。  
        public void Reset();  
        //  
        // 摘要:  
        //     停止时间间隔测量,将运行时间重置为零,然后开始测量运行时间。  
        public void Restart();  
        //  
        // 摘要:  
        //     开始或继续测量某个时间间隔的运行时间。  
        public void Start();  
        //  
        // 摘要:  
        //     停止测量某个时间间隔的运行时间。  
        public void Stop();  
    }  
}  

使用StopWatch类注意问题:

1、StopWatch类在System.Diagnostics 命名空间下,在使用StopWatch的文件中要添加using System.Diagnostics;

2、常用函数: public Stopwatch();public void Reset();public void Start();public void Restart();public void Stop();

3、public void Restart();相当于public void Reset();+public void Start();

使用StopWatch定时方法:

1、定义一个StopWatch对象

Stopwatch sw = new Stopwatch(); 

2、开始计时

sw.Start();  

3、重新设置并开始计时

sw.Restart();  

4、结束计时

sw.Stop();  

5、获取运行时间[毫秒]

long times = sw.ElapsedMilliseconds;  

我们在程序中可以判断运行时间是否达到我们需要的延时时间,如果时间达到,则程序往下运行。这样就达到定时目的。
在进行算法评估时候,我们在算法开始的时候打开定时器,程序结束时停止定时器,之后获取定时器运行时间,即可得到算法运行时间。

Stopwatch 在基础计时器机制中对计时器的计时周期进行计数,从而测量运行时间。 如果安装的硬件和操作系统支持高分辨率性能计数器,则 Stopwatch 类将使用该计数器来测量运行时间; 否则,Stopwatch 类将使用系统计数器来测量运行时间。 使用 Frequency 和 IsHighResolution 字段可以确定实现 Stopwatch 计时的精度和分辨率。

例子1,用作延时

Stopwatch sw = new Stopwatch();  
//开始计时  
sw.Start(); 
//某算法
Funcation();
//判断延时是否到达
if (sw.ElapsedMilliseconds>10)
{
	Funcation1();
	//到达则运行函数1
}
//否则运行函数2
else
	Funcation2();

//结束计时  
sw.Stop();    

也可以使用Switch Case进行延时操作。定时器开始后转到下一步Case进行判断即可。

例子2,用作算法耗时评估

Stopwatch sw = new Stopwatch();  
//开始计时  
sw.Start(); 
//某算法
Function();
//结束计时  
sw.Stop();  
//获取运行时间[毫秒]  
long times = sw.ElapsedMilliseconds;  
TextBox1.Text += "执行算法总共使用了" + times + "毫秒";  
  • 博主简介:
  • 工业自动化上位机软件工程师、机器视觉算法工程师、运动控制算法工程师。目前从业于智能制造自动化行业。 博主邮箱:2296776525@qq.com
  • 帮忙点个赞吧。哈哈。
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# Quartz是一个强大、开源、轻量的作业调度框架,可以用于定时执行任务。具体而言,你可以将要定时执行的任务代码写到实现了IJob接口的Execute方法中,当时间到达后,任务会自动执行。 以下是创建和执行C# Quartz定时任务的步骤: 1. 创建一个调度单元,可以使用StdSchedulerFactory类的GetDefaultScheduler方法来获取默认调度器。 2. 创建一个具体的作业(job),这个作业需要实现IJob接口,并且将任务代码写在其Execute方法中。 3. 创建并配置一个触发器(trigger),定义任务的执行时间。可以使用TriggerBuilder类的Create方法来创建触发器,并使用WithCronSchedule方法来指定任务的执行时间表达式。 4. 将作业和触发器加入到作业调度池中,使用调度器的ScheduleJob方法。 5. 开启调度器,使用调度器的Start方法。 下面是一个示例代码,展示了如何使用C# Quartz进行定时任务的创建和执行: ```csharp public class ScheduleManage { public static void Show() { // 创建调度单元 Task<IScheduler> tsk = StdSchedulerFactory.GetDefaultScheduler(); IScheduler scheduler = tsk.Result; // 创建一个具体的作业 IJobDetail job = JobBuilder.Create<SendMessageJob>() .WithIdentity("完成") .Build(); // 创建并配置一个触发器 ITrigger _CronTrigger = TriggerBuilder.Create() .WithIdentity("定时确认") .WithCronSchedule("0/2 * * * * ?") // 每2秒执行一次 .Build() as ITrigger; // 将作业和触发器加入到作业调度池中 scheduler.ScheduleJob(job, _CronTrigger); // 开启调度 scheduler.Start(); Console.ReadLine(); } } ``` 请注意,以上代码仅为示例,实际使用时需要根据具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值