3

我目前正在开发一个应用程序,我想实现一个时间延迟。我不想使用 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 和验证开始之间添加一点延迟。

4

5 回答 5

7

怎么样:

await Task.Delay(5000)

? 它不会阻塞 UI 线程,看起来还不错!

于 2013-01-31T12:09:02.833 回答
2

我永远不会忘记这个精彩的片段。它适用于 Windows 窗体应用程序,并且比创建Timer.

于 2013-01-31T12:08:17.990 回答
1

搜索延迟功能(不使用Sleep)后,我发现了这个

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。也许这对其他人有用。

于 2013-09-22T20:09:42.043 回答
0

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

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

于 2013-01-31T12:11:07.990 回答
0

一旦用户填写了所有相关信息并单击“检查”,就会调用验证方法列表。在调用其中任何一个之前,执行 ping 以确保计算机上有实时 Internet 连接。我想在 ping 和验证开始之间添加一点延迟。

最好的做法是,您所有长时间的任务都在单独的线程中完成。如果你有.NET 4.0+,你可以使用TaskTPL)。如果您的任务与您交互,UI则可以使用基于事件的异步模式(如果不可TPL用)。

具体一下Ping可以用Ping.SendAsync。请检查帖子以获取更多详细信息。

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

于 2013-01-31T12:56:59.527 回答