C#延时函数 非Sleep

转载 2013年12月06日 09:14:10

在很多时候,我们的程序,在执行下一步操作之前,需要等待上一步的执行完成,这种延时等待的方式在异步操作,或者是利用消息循环机制通信的程序中,最为体现的明显。

举个API的例子:

我们自己的程序是A,需要利用API结合Windows 消息机制,控制外部程序B;

A向B发送一个消息,B去执行,此时A需要等待B执行完后,根据B的执行结果,再次向B发送下一个消息

上面的例子,是个很典型的延时应用。

说到延时,大家可能第一反应,就是 Sleep 

先不谈 Sleep 延时的精度如何,Sleep 的一个致命的弱点,就是 Sleep 的过程中,进程是不能响应外部操作的,变成了假死状态,这样的话,一个是用户体验很差,再者,用户想中途终止也不行,只能干等,或者强制 KILL 掉程序。

所以,此时的Sleep是不可取的。我们需要的,是一个可以继续响应操作,而且精度高的延时函数。

下面,我们自己实现一个:

1.引用namespace

[csharp] view plaincopy
  1. using System.Runtime.InteropServices;  

2.引用API函数

[csharp] view plaincopy
  1. [DllImport("kernel32.dll")]  
  2. private static extern uint GetTickCount();  

3.声明延时函数

[csharp] view plaincopy
  1. private void Delay(uint ms)  
  2.         {  
  3.             uint start = GetTickCount();  
  4.             while (GetTickCount() - start < ms)  
  5.             {  
  6.                 Application.DoEvents();  
  7.                 Console.WriteLine((GetTickCount() - start).ToString());  
  8.             }  
  9.         }  

4.调用Delay函数(其中ms为毫秒)

[csharp] view plaincopy
  1. private void button4_Click(object sender, EventArgs e)  
  2.         {  
  3.             Delay(5000);//等待5秒  
  4.         }  

相关文章推荐

C#_不假死的延时

在使用c#的时候常常会遇到一些莫名奇妙的问题,比如当使用正则匹配大量文本的时候,如果在匹配前添加一个提示框就可以匹配成功,否则可能匹配失败,比如从流中读取数据的时候,等待网页刷新的时候... 不得不...

延时函数和Timer的使用

延时函数和Timer的使用 //延时函数: [NSThread sleepForTimeInterval:5.0]; //暂停5s. //Timer的使用: NSTimer *connec...

delphi延时函数(相当于sleep函数)

  • 2011年10月02日 21:33
  • 171KB
  • 下载

C# 延时函数

1 调用WIN API中的GetTickCount [DllImport("kernel32")] static extern uint GetTickCount(); 从操作系统启动...

Linux平台延时之sleep、usleep、nanosleep、select比较

Linux平台延时之sleep、usleep、nanosleep、select比较   1、sleep的精度是秒 2、usleep的精度是微妙,不精确 3、select的精度是微妙,精确 ...
  • lile777
  • lile777
  • 2015年05月05日 15:28
  • 5707

STM32精确延时(非中断,非ST库函数)

STM32精确延时(非中断,非ST库函数)             前天学了下stm的systick,发现还满好用的,可以用来精确定时.以前在用CVAVR的时候发现里面的delay.h非常好用....
  • hbaizj
  • hbaizj
  • 2012年04月16日 20:34
  • 6133
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#延时函数 非Sleep
举报原因:
原因补充:

(最多只允许输入30个字)