C#延时程序

来源:互联网 发布:任务分析矩阵 编辑:程序博客网 时间:2024/05/21 22:23

在C#窗口程序中,如果在主线程里调用Sleep,在Sleep完成之前, 界面呈现出假死状态,不能响应任何操作!
下边实现的是非独占性延时函数,延时过时中界面仍可响应消息:

public static void Delay(int milliSecond){    int start = Environment.TickCount;    while (Math.Abs(Environment.TickCount - start) < milliSecond)    {        Application.DoEvents();    }}

关于Math.Abs():

  Environment.TickCount,内部API是用DWORD GetTickCount()来实现的,该属性的值从系统计时器派生,并以 32 位有符号整数的形式存储。因此,如果系统连续运行,TickCount 将在约 24.9 天内从零递增至 Int32. MaxValue ,然后跳至 Int32. MinValue (这是一个负数),再在接下来的 24.9 天内递增至零。DWORD是无符号的,而 Environment.TickCount属性返回的值是有符号的,所以有一半的值用负数表示!

其他:
1.用sleep()使线程休眠。
直接在需要延时的地方插入 System.Threading.Thread.Sleep(1000); 即可。
这种方式最方便,但是延时过程中会停止其他响应,如果用在主线程中会造成程序的假死。如果有异步操作的话也会暂停,例如用webBrowser加载网页,本来希望延时一段时间等待网页加载完毕,但用sleep的话同时会暂停网页的加载过程。

用Thread和Timer控件都可以实现,如果用Timer_Tick(…)的话,因为不能在其他函数中调用Timer_Tick(…),所以用起来不方便,其实这两种都是用到了线程,微软推荐的方法是用委托。
用C#中的线程来实现:
using System.Threading;//引入命名空间
1.延时10ms代码为:
Thread.Sleep(10);
2.延时1s代码为:
Thread.Sleep(1000);

平时我们在做winform开发的时候,有时候需要让程序休眠几秒钟,但是,如果我们直接使用 thread.sleep()函数,页面ui就会停止响应。怎么样解决呢,你可以把页面涉及到表现ui的代码放到一个单线程处理,也可以采用我下面的做法,加一个小函数ok了。

/// <summary>        /// 延时函数        /// </summary>        /// <param name="delayTime">需要延时多少秒</param>        /// <returns></returns>        public static bool Delay(int delayTime)        {            DateTime now = DateTime.Now;            int s;            do            {                TimeSpan spand = DateTime.Now - now;                s = spand.Seconds;                Application.DoEvents();            }            while (s < delayTime);            return true;        }
0 0
原创粉丝点击