C#使用定时器生成延迟 [英] C# Generating Delay Using Timer

查看:0
本文介绍了C#使用定时器生成延迟的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用计时器在代码中生成延迟。间隔为10毫秒,我的已用函数为timer1_Tick。计时器启动,以下是我的函数:

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (delay_ms != 0) 
        {
            delay_ms--;
        }
    }
    void Timer_Delay(uint delay)
    {
        delay_ms = delay;
        while (delay_ms != 0) ;
    }

我的timer1_Tick工作正常(已测试),但在Timer_Delay函数中,代码挂在while (delay_ms != 0) ;行。它应该在Timer_Delay(100)中的1秒后通过这一行,对吗? 以下是使用计时器延迟而不是Thread.sleep

的示例
if (ROTOR_TIME_CONSTANT.BackColor.Equals(Color.Thistle))
            {
                do
                {
                    serialPort.Write("vA" + ROTOR_TIME_CONSTANT.Value + "*");
                    //System.Threading.Thread.Sleep(20);
                    Timer_Delay(100);
                } while (ROTOR_TIME_CONSTANT.BackColor.Equals(Color.Thistle));

推荐答案

改用Thread.Sleep(delayInMilliseconds)。签出文档here

更新

如果要使用计时器,可以使用EventWaitHandle

    EventWaitHandle ewh;
    uint delay_ms;
    private void timer1_Tick(object sender, EventArgs e)
    {
        if (delay_ms != 0)
        {
            delay_ms--;

            if(delay_ms == 0)
            {
                ewh.Set();
            }
        }
    }
    void Timer_Delay(uint delay)
    {
        ewh = new EventWaitHandle(false, EventResetMode.ManualReset);
        delay_ms = delay;
        ewh.WaitOne();
    }

更新2

这在使用System.Windows.Forms.Timer的WinForms环境中不起作用,因为它运行在相同的UI线程上。因此,如果您阻止用户界面的线程,您的计时器将永远不会滴答作响。如果您仍要使用计时器,则可以使用System.Timers.TimerSystem.Timers.Timer更准确,并且在单独的线程上操作,但这样会阻塞UI,直到延迟过去,因为您阻塞了它的线程。
如果您需要等待,您可以首先创建一个单独的线程并在那里运行您的进程,因此,如果您暂停该线程,UI将保持响应。

这篇关于C#使用定时器生成延迟的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆