zoukankan      html  css  js  c++  java
  • .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实现的。

  • 相关阅读:
    汽车档位作用
    大家免着惊
    出头天 闽南语歌词
    Configuration所有配置简介
    android图片缓存框架Android-Universal-Image-Loader
    java泛型 之 入门(interface)
    broadcom6838开发环境实现函数栈追踪
    win 开机 Microsoft corparation 滚动栏
    Linux中下载,压缩,解压等命令
    python实现人人网用户数据爬取及简单分析
  • 原文地址:https://www.cnblogs.com/happyframework/p/3222213.html
Copyright © 2011-2022 走看看