繁体   English   中英

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

[英]What is the best way to wait for a certain time (say 10 seconds) in C#?

我想等待15秒,然后控制应该从下一个语句恢复。

等待时我没有别的事可做(只是等待)。

我知道有Thread.Sleep(15000) 我不知道的是等待的最佳方法? 这有什么限制?

代码如下:

Method()
{
   statement 1;
   statement 2;
   //WaitFor 15 secs here;
   statement 3;
}

Thread.Sleep的缺点是,如果在GUI线程(处理GUI事件的线程,例如,按钮单击处理程序方法,或从按钮单击处理程序调用的方法等)中调用它,那么您的应用程序将出现冻结并且对那些15秒没有反应。

如果你已经明确地创建了一个单独的线程并且在其中调用了Thread.Sleep,假设你不介意该线程在15秒内没有做任何事情,那将完全没问题。

另一种方法是创建一个Timer并在stmt 2之后启动它,并将stmt 3放在计时器的Tick事件处理程序中,并在该处理程序中停止计时器。

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

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

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

如果在等待时没有其他任何事情可做,Thread.sleep似乎是明智之举。 它使线程暂时休眠,因此它不使用任何CPU资源。

尝试以下内容:

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

您可以始终使用计时器,然后在设置的持续时间后执行代码。 但是,如果你实际上不需要做任何事情而只是想在代码中的某个特定点等待,那么我认为Thread.Sleep(150000); 足够了。 [编辑:拼写]

如果您总是想等待一段时间,那么Sleep有用。 显然,您不应该在预期及时响应的线程上执行此操作。

请记住,在所有情况下,您的线程都会休眠一段时间。 如果由于某种原因你想让线程更快恢复,你最好使用信令或回调。 通过使用其中任何一种而不是Sleep ,您将最大限度地减少不必要的等待时间。

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
}

我不确定100%,但如果你真的需要你的方法在等待15秒后返回,请尝试以下方法:


Method()
{
   stmt1();
   stmt2();

   int time = DateTime.Now.Millisecond;
   while (15*1000 > DateTime.Now.Millisecond - time)
   {
       Thread.Sleep(10)
       Application.DoEvents();
   }
   stmt3();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM