在C#中等待一段时间(比如10秒)的最佳方法是什么?

Nar*_*esh 7 c#

我想等待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事件处理程序中,并在该处理程序中停止计时器.


Sho*_*ban 6

这可能不是您问题的直接答案.我会说检查你的流程是否比检查代码是否更好更好;-)

你是否等待15秒才确保stmt2; 完成了?如果是这样,那么只要执行stmnt 2就添加一个处理程序,这将是一个更好的解决方案(?)

您也可以使用计时器等待.Thread.sleep是一个糟糕的设计.我们有一个类似的问题,讨论使用Thread.sleep和Timer进行比较.


jri*_*sta 3

尝试如下操作:

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 等),直到另一个线程上的定时调用完成。

  • 这个例子有问题。它不会可靠地工作,因为任何地方都没有保留对“Timer”对象的引用。因此,它会受到垃圾收集的影响。延迟的时间越长,出现问题的可能性就越大。来自 MSDN:*只要您使用计时器,就必须保留对它的引用。与任何托管对象一样,当没有对 Timer 的引用时,它会受到垃圾回收的影响。计时器仍然处于活动状态这一事实并不妨碍它被收集。* (5认同)