• .NET:在C#中模拟Javascript的setTimeout方法


    背景

    每种语言都有自己的定时器(Timer),很多人熟悉Javascript中的setInterval和setTimeout,在Javascript中为了实现平滑的动画一般采用setTimeout模拟setInterval,这是因为:setTimeout可以保证两次定时任务之间的时间间隔,而setInterval不行(小于设置的间隔时间)。C#中如何模拟setTimeout呢?

    System.Timers.Timer

    模拟setInterval

    代码

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Timers;
     7 using System.Threading;
     8 
     9 namespace TimerTest
    10 {
    11     class Program
    12     {
    13         static void Main(string[] args)
    14         {
    15             var timer = new System.Timers.Timer(2000);
    16             timer.Elapsed += timer_Elapsed;
    17 
    18             Console.WriteLine(DateTime.Now.Second);
    19             timer.Start();
    20 
    21             Console.Read();
    22         }
    23 
    24         static void timer_Elapsed(object sender, ElapsedEventArgs e)
    25         {
    26             Thread.Sleep(6000);
    27             Console.WriteLine(DateTime.Now.Second);
    28         }
    29     }
    30 }

    运行效果

    分析

    如果定时器任务执行的时间比较长,两次任务之间会有重叠,下面介绍如何避免这个问题。

    模拟setTimeout

    代码

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Timers;
     7 using System.Threading;
     8 
     9 namespace TimerTest
    10 {
    11     class Program
    12     {
    13         static void Main(string[] args)
    14         {
    15             var timer = new System.Timers.Timer(2000);
    16             timer.Elapsed += timer_Elapsed;
    17             timer.AutoReset = false;
    18 
    19             Console.WriteLine(DateTime.Now.Second);
    20             timer.Start();
    21 
    22             Console.Read();
    23         }
    24 
    25         static void timer_Elapsed(object sender, ElapsedEventArgs e)
    26         {
    27             Thread.Sleep(6000);
    28             Console.WriteLine(DateTime.Now.Second);
    29 
    30             (sender as System.Timers.Timer).Start();
    31         }
    32     }
    33 }

    运行效果

    分析

    这样就能保证定时任务的执行不会重叠了。

    备注

    while(true) + sleep 也可以做到,不知道微软的Timer内部是不是用sleep实现的。

  • 相关阅读:
    TinyEditor:简洁且易用的html所见即所得编辑器
    arguments.callee 调用自身
    java.io.IOException: 设备未就绪
    关于vcastr3播放器自动播放的问题
    javascript中IE浏览器不支持NEW DATE()带参数的解决方法
    Oracle常用查看表结构命令
    java通过文件头内容判断文件类型
    RS开发日期提示控件默认为昨天
    Cognos更新问题之利用Transform实现Cube增量更新
    SqlServer中从字符串中获取项目指标方法charindex月substring结合
  • 原文地址:https://www.cnblogs.com/happyframework/p/3222213.html
Copyright © 2020-2023  润新知