我想等待15秒,然后控制应该从下一个语句恢复.
等待时我没有别的事可做(只是等待).
我知道有Thread.Sleep(15000).我不知道的是等待的最佳方法?这有什么限制?
代码如下:
Method()
{
statement 1;
statement 2;
//WaitFor 15 secs here;
statement 3;
}
Run Code Online (Sandbox Code Playgroud)
Aar*_*nLS 11
Thread.Sleep的缺点是,如果在GUI线程(处理GUI事件的线程,例如,按钮单击处理程序方法,或从按钮单击处理程序调用的方法等)中调用它,那么您的应用程序将出现冻结并且对那些15秒没有反应.
如果你已经明确地创建了一个单独的线程并且在其中调用了Thread.Sleep,假设你不介意该线程在15秒内没有做任何事情,那将完全没问题.
另一种方法是创建一个Timer并在stmt 2之后启动它,并将stmt 3放在计时器的Tick事件处理程序中,并在该处理程序中停止计时器.
这可能不是您问题的直接答案.我会说检查你的流程是否比检查代码是否更好更好;-)
你是否等待15秒才确保stmt2; 完成了?如果是这样,那么只要执行stmnt 2就添加一个处理程序,这将是一个更好的解决方案(?)
您也可以使用计时器等待.Thread.sleep是一个糟糕的设计.我们有一个类似的问题,讨论使用Thread.sleep和Timer进行比较.
尝试如下操作:
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
);
}
Run Code Online (Sandbox Code Playgroud)
语法为 C# 3.0,使用 lambda 表达式有效地围绕语句 #3 创建闭包。这样,您就可以使用 Method 的任何局部变量。然而,需要注意的是,使用此方法或任何其他基于计时器的方法......该函数将在创建计时器后立即返回。在计时器执行之前,该函数不会阻塞。为了实现这一点,我唯一能想到的就是实际使用线程并使 Method() 阻塞在信号上(即 WaitHandle、ResetEvent 等),直到另一个线程上的定时调用完成。