我想等待15秒,然后控件应该从下一个声明恢复。
等待时我没有别的事可做(只是等待)。
我知道有Thread.Sleep(15000)
。我不知道的是等待的最佳方法?有什么限制?
代码如下:
Method()
{
statement 1;
statement 2;
//WaitFor 15 secs here;
statement 3;
}
答案 0 :(得分:11)
Thread.Sleep的缺点是如果在GUI线程中调用它(处理GUI事件的线程,例如,按钮单击处理程序方法,或者从按钮单击处理程序调用的方法等),那么你应用程序似乎会冻结并在15秒内无响应。
如果你已经明确地创建了一个单独的线程并在其中调用了Thread.Sleep,假设你不介意该线程在15秒内没有做任何事情,那将是完全没问题的。
另一种方法是创建一个Timer并在stmt 2之后启动它,并将stmt 3放在计时器的Tick事件处理程序中,并在该处理程序中停止计时器。
答案 1 :(得分:6)
这可能不是您问题的直接答案。我会说检查你的流程是否比检查代码是否更好更好; - )
你是否等待15秒才确保stmt2;完成了?如果是这样,那么只要执行stmnt 2,添加处理程序将是更好的解决方案(?)
您也可以使用计时器等待。 Thread.sleep是一个糟糕的设计。我们有一个类似的问题,谈论comparison using Thread.sleep and Timer。
答案 2 :(得分:2)
如果等待时没有其他任何事情可做,那么Thread.sleep似乎是明智之举。 它使线程暂时休眠,因此它不使用任何CPU资源。
答案 3 :(得分:2)
尝试以下内容:
void Method()
{
console.log('statement 1');
console.log('statement 2');
var timer = new System.Threading.Timer(
o => // timer callback
{
console.log('statement 2');
},
15000, // Delay
0 // Repeat-interval; 0 for no repeat
);
}
语法是C#3.0,使用lambda表达式有效地在语句#3周围创建一个闭包。有了这个,你可以使用Method的任何局部变量。但是要注意的是,使用此方法或任何其他基于计时器的方法...函数将在创建计时器后立即返回。在Timer执行之前,该功能不会阻塞。为了实现这一点,我唯一能想到的是实际使用线程并对信号(即WaitHandle,ResetEvent等)进行Method()阻塞,直到另一个线程上的定时调用完成。
答案 4 :(得分:1)
您可以随时使用计时器,然后在设定的持续时间后执行代码。但是,如果你实际上不需要做任何事情而只是想在代码中的某个特定点等待,那么我认为Thread.Sleep(150000);足够了。 [编辑:拼写]
答案 5 :(得分:0)
如果您总是想等待一段时间,那么Sleep
就很有用了。显然,您不应该在预期及时响应的线程上执行此操作。
请记住,在所有情况下,您的线程都会休眠一段时间。如果由于某种原因你想让线程更快恢复,你最好使用信令或回调。通过使用其中任何一个而不是Sleep
,您将最大限度地减少不必要的等待时间。
答案 6 :(得分:0)
void Method()
{
Statement1();
Statement2();
// Start the timer for a single 15 second shot.
// Keep a reference to it (Mytimer) so that the timer doesn't get collected as garbage
Mytimer = new System.Threading.Timer((a) =>
{
// Invoke the 3rd statement on the GUI thread
BeginInvoke(new Action(()=>{ Statement3(); }));
},
null,
15000, // 15 seconds
System.Threading.Timeout.Infinite); // No repeat
}
答案 7 :(得分:-1)
我不确定100%,但如果你真的需要你的方法在等待15秒后返回,请尝试以下方法:
Method()
{
stmt1();
stmt2();
int time = DateTime.Now.Millisecond;
while (15*1000 > DateTime.Now.Millisecond - time)
{
Thread.Sleep(10)
Application.DoEvents();
}
stmt3();
}