我目前正在开发一个应用程序,我想实现一个时间延迟。我不想使用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和验证开始之间添加一点延迟。
答案 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+
,则可以使用Task
(TPL)。如果您的任务与UI
互动,则可以使用Event-based Asynchronous Pattern,如果没有TPL
可用。
具体关于Ping
您可以使用Ping.SendAsync
。请查看post了解更多详情。
尝试这些并返回新的更有趣的问题。