2013-03-24 49 views
-6

伙计们有没有在VB中的任何选项在VB中?c#中的延迟不thread.sleep

Sub Delay(ByVal dblSecs As Double) 

Const OneSec As Double = 1.0#/(1440.0# * 60.0#) 
Dim dblWaitTil As Date 
Now.AddSeconds(OneSec) 
dblWaitTil = Now.AddSeconds(OneSec).AddSeconds(dblSecs) 
Do Until Now > dblWaitTil 
Application.DoEvents() ' Allow windows messages to be processed 
Loop 

End Sub 
+4

这是一个繁忙的等待 - 中绝大多数延迟方式中最差的。 – dasblinkenlight 2013-03-24 11:14:28

+0

它看起来像你在做:'DateTime dblWaitTil = DateTime.Now.AddSeconds(dblSecs); while(DateTime.Now 2013-03-24 11:15:26

+0

*为什么*你想延迟?我问,因为你的答案可能会提供一个更好的解决办法,而不是简单地拖延。 – 2013-03-24 11:50:16

回答

0

是的,你可以在C#同样的事情,但是这是一个非常糟糕的主意。

这种暂停方式称为繁忙循环,因为它会使主线程尽可能多地使用CPU。

你想要做的,而不是什么是建立一个定时器,由蜱事件调用回调方法:

public void Wait(double seconds, Action action) { 
    Timer timer = new Timer(); 
    timer.Interval = (int)(seconds * 1000.0); 
    timer.Tick += (s, o) => { 
    timer.Enabled = false; 
    timer.Dispose(); 
    action(); 
    }; 
    timer.Enabled = true; 
} 

用例:

textbox.text = "Test"; 
Wait(5.0,() => { 
    textbox.text = "Finish"; 
}); 
+0

我想链接这个textbox.text =“测试”;延迟(5秒),然后文本框.text =“Finish”; isa还有其他的好方法吗? – user1965804 2013-03-24 11:24:12

+0

这是异步的,它不会真的等待,如果你的程序在间隔之前完成,回调代码永远不会被调用。 OP想要这样的行为 – SergeyS 2013-03-24 11:32:45

+0

@SergeyS:是的,它是异步的,这就是你在事件驱动的环境中如何做这样的事情。你有什么建议呢?忙碌循环? – Guffa 2013-03-24 11:44:35

0

你想Timer类或DispatcherTimer类哪个适合您的需求。

+0

你可以举例,我是新来的C#..( – user1965804 2013-03-24 11:14:08

+0

请参阅附加链接,他们有他们的小例子。 – 2013-03-24 11:15:07