在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实现的。

 
分类: .NET

在C#中模拟Javascript的setTimeout方法的更多相关文章

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

    背景 每种语言都有自己的定时器(Timer),很多人熟悉Javascript中的setInterval和setTimeout,在Javascript中为了实现平滑的动画一般采用setTimeout模拟 ...

  2. 006——VUE中的内容与属性中使用javascript表达式的方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. (一)学习JavaScript之setTimeout方法

    参考:http://www.w3school.com.cn/jsref/met_win_settimeout.asp HTML DOM Window 对象 定义和用法 setTimeout() 方法用 ...

  4. javascript高级编程3第二章:在html中使用javascript

    2.1 <script>元素 向html页面中插入javascript的主要方法,就是使用<script>元素.这个元素被加入到正式的html规范中.html4.01为< ...

  5. Javascript高级程序设计——在HTML中使用Javascript

    <script>元素 向HTML页面中插入Javascript的主要方法,就是使用<script>元素,<script>元素有六个属性: async:可选.表示应该 ...

  6. 2. javacript高级程序设计-在HTML中使用JavaScript

    1.1 <script>元素 向HTML页面中插入JavaScript的主要方法,就是使用<script>元素,<script>元素定义了一下6个元素: (1). ...

  7. Javascript系列之在HTML中使用JavaScript

    本文主要包括以下几方面内容: 1)使用<script>元素 2)嵌入脚本和外部脚本 3)文档模式对JavaScript的影响 4)考虑禁用JavaScript的场景 只要一提到把Javas ...

  8. HTML 中使用 JavaScript

    在 HTML 中插入 JavaScript 的主要方法,就是使用 <script> 元素, 浏览器会解释并执行其中的 JavaScript 代码. <script>  元素的属 ...

  9. html中script标签的使用方法

    向HTML页面中插入JavaScript的主要方法,就是使用<script>元素.这个元素由Netscape创造并在Netscape Navigator2中首先实现.后来,这个元素被加入到 ...

随机推荐

  1. ionic入门之基本布局

    目录: 简介 Hybrid vs. Others ionic CSS框架 基本布局 布局模式 定高条块:.bar .bar : 位置 .bar : 嵌入子元素 .bar : 嵌入input 内容:.c ...

  2. TestNg的xml配置

    TestNG中,可以通过配置xml来运行某一类.包.方法. 1.通过TestNg运行某一个类 <?xml version="1.0" encoding="UTF-8 ...

  3. Java多线程之进程和线程

    在并发编程中有两个基本的概率就是进程和线程.在Java编程中并发编程更多的是关注线程.但是进程也是很重要的. 一个计算机一般会有很多活跃的进程和线程.有一点是没有疑问的在单核系统中,任何时候实际上都是 ...

  4. MySQL之查询优化方式(笔记)

    1.COUNT() 对COUNT的优化可以通过下面的SQL实现 mysql> select count(gnp<10000 or null) as '<<<<',c ...

  5. Android-往来:包Group添加到联系人

    long groupId = Constant.createGroupId; ContentValues values = new ContentValues(); for(int i=0,len=C ...

  6. 值为NULL的对象指针

    相信大家对NULL不会很陌生,NULL 是一个标准规定的宏定义,用来表示空指针常量,当一个指针变量被赋值为NULL时,表示它不再指向任何有效地址,无法在访问任何数据.在VS2012库文件stdio.h ...

  7. NPOI 2.0 Excel读取显示

    NPOI 2.0 Excel读取显示   最近接到需求,需要把excel表格里的数据原样展示到web页面,主要是满足随意跨行跨列. 之前用过一点NPOI,不过接触的不太多,趁这次机会再熟悉一下.由于操 ...

  8. CompareValues标签对Model中的属性进行验证

    在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证   在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现Model两个 ...

  9. 利用Bootstrap框架制作查询页面的界面

    UI设计实战篇——利用Bootstrap框架制作查询页面的界面   Bootstrap框架是一个前端UI设计的框架,它提供了统一的UI界面,简化了设计界面UI的过程(缺点是定制了界面,调整的余地不是太 ...

  10. VMware上安装ubuntu 13.04

    作者:viczzx 出处:http://www.cnblogs.com/zixuan-zhang 欢迎转载,也请保留这段声明.谢谢! 这两天打算在Linux环境下学Python语言,想换个高点的ubu ...