应用程序的C#时间延迟

时间:2013-01-31 12:07:06

标签: c# timer delay

我目前正在开发一个应用程序,我想实现一个时间延迟。我不想使用System.Threading.Thread.Sleep(x);当我读到这个停止线程(UI冻结)

我目前编写的代码是:

public void atimerdelay()
{
    lblStat.Text = "In the timer";
    System.Timers.Timer timedelay;
    timedelay = new System.Timers.Timer(5000);
    timedelay.Enabled = true;
    timedelay.Start();
}

我知道atimerdelay()会被调用(使用lblStat),但它们没有5秒的延迟。我已阅读http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx,但我无法理解上述代码无效的原因。

补充资料 - (为Hamlet Hakobyan添加)

该应用程序是一个“卡片检查器”应用程序(大学项目 - 不使用或存储真实信息)。一旦用户填写了所有相关内容并单击“检查”,就会调用验证方法列表。在调用其中任何一个之前,执行ping操作以确保计算机上有实时Internet连接。我想在ping和验证开始之间添加一点延迟。

5 个答案:

答案 0 :(得分:7)

怎么样:

await Task.Delay(5000)

?它不会阻止UI线程,看起来很不错!

答案 1 :(得分:2)

我永远不会忘记this wonderful snippet。它适用于Windows窗体应用程序,比创建Timer

更轻量级

答案 2 :(得分:1)

在搜索延迟功能(不使用睡眠)后,我找到了这个

public static DateTime PauseForMilliSeconds(int MilliSecondsToPauseFor)
{
    System.DateTime ThisMoment = System.DateTime.Now;
    System.TimeSpan duration = new System.TimeSpan(0, 0, 0, 0, MilliSecondsToPauseFor);
    System.DateTime AfterWards = ThisMoment.Add(duration);

    while (AfterWards >= ThisMoment)
    {
        System.Windows.Forms.Application.DoEvents();
        ThisMoment = System.DateTime.Now;
    }

    return System.DateTime.Now;
}

完美运行,使用.NET 4.0进行测试。也许这对其他人有用。

答案 3 :(得分:0)

您可以使用System.Timers.Timer在时间间隔过后触发事件。它们对于简单地延迟执行没有用处。

如果您在代码中添加了timedelay.Elapsed += delayedFunction;,那么5秒后就会调用delayedFunction

答案 4 :(得分:0)

  

用户填写完所有相关内容后,点击“检查”列表   调用验证方法。在任何这些被称为之前   执行ping以确保实时互联网连接   电脑。我想在ping和之间添加一点延迟   开始验证。

这是一个很好的做法,所有长时间播放的任务都在单独的线程中完成。如果您有.NET 4.0+,则可以使用TaskTPL)。如果您的任务与UI互动,则可以使用Event-based Asynchronous Pattern,如果没有TPL可用。

具体关于Ping您可以使用Ping.SendAsync。请查看post了解更多详情。

尝试这些并返回新的更有趣的问题。