如何在不使用睡眠的情况下在C#中执行短暂延迟?

时间:2013-08-22 05:34:36

标签: c# timer delay sleep

我对编程非常陌生,到目前为止,我一直学得很好,我想,但我仍然无法理解按照我想要的方式做出延迟的想法。我正在研究的是使用涉及战斗系统的Windows表单应用程序的一种测试“游戏”。在其中,我想让NPC每隔几秒钟做一次动作。问题是,我还想让玩家在攻击之间进行交互。 Thread.sleep似乎对我不起作用,不仅因为我不知道如何多线程,而且每当我尝试运行它时,比如说:

 textBox1.Text += "\r\nThread Sleeps!";
 System.Threading.Thread.Sleep(4000);
 textBox1.Text += "\r\nThread awakens!";

似乎坚持先睡觉,然后打印两条线。

我认为现在我只能这么说,但如果那仍然太模糊或罗嗦,请随时告诉我。

简而言之,在C#中我希望在运行之前做出一些延迟,但同时仍允许用户交互。

5 个答案:

答案 0 :(得分:56)

如果您使用的是.NET 4.5,则可以使用新的async / await框架在不锁定线程的情况下进入休眠状态。

它的工作原理是使用async关键字标记需要异步操作的函数。这只是编译器的一个提示。然后在您希望代码异步运行的行上使用await关键字,程序将在不锁定线程或UI的情况下等待。您调用的方法(在等待行上)也必须使用async关键字标记,并且通常以Async结尾命名,如 ImportFilesAsync

您的示例中需要做的是:

  1. 确保您的程序 .Net Framework 4.5 目标框架
  2. 使用async关键字标记您需要睡眠的功能(请参阅下面的示例)
  3. using System.Threading.Tasks;添加到您的代码中。
  4. 您的代码现已准备好使用Task.Delay方法而不是System.Threading.Thread.Sleep方法(可以在await上使用Task.Delay,因为Task.Delay是在其定义中标有async

    private async void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text += "\r\nThread Sleeps!";
        await Task.Delay(3000);
        textBox1.Text += "\r\nThread awakens!";
    }
    

    您可以在此处详细了解Task.DelayAwait

答案 1 :(得分:4)

很抱歉唤醒了这样一个古老的问题。 但我认为原作者想要的答案是:

您需要强制程序在对textbox1进行更改后进行图形更新。你可以通过调用Update();

来做到这一点
textBox1.Text += "\r\nThread Sleeps!";
textBox1.Update();
System.Threading.Thread.Sleep(4000);
textBox1.Text += "\r\nThread awakens!";
textBox1.Update();

通常,这将在线程完成后自动完成。 例如,按下按钮,对文本进行更改,线程消失,然后.Update()被触发,您将看到更改。 (我不是专家,所以当它被解雇时我无法告诉你,但它的任何方式都与此类似。)

在这种情况下,您进行更改,暂停线程,然后再次更改文本,当线程终止时,.Update()被触发。这导致您只看到对文本所做的最后一次更改。

如果您在文本更改之间执行了很长时间,则会遇到同样的问题。

答案 2 :(得分:2)

通过在程序中添加using System.Timers;,您可以使用此功能:

private static void delay(int Time_delay)
{
   int i=0;
  //  ameTir = new System.Timers.Timer();
    _delayTimer = new System.Timers.Timer();
    _delayTimer.Interval = Time_delay;
    _delayTimer.AutoReset = false; //so that it only calls the method once
    _delayTimer.Elapsed += (s, args) => i = 1;
    _delayTimer.Start();
    while (i == 0) { };
}

延迟是一个功能,可以像:

一样使用
delay(5000);

答案 3 :(得分:1)

您可以使用计时器:http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

定时器可为您提供高达1毫秒的精度。根据节拍间隔,将生成一个事件。在tick事件中做你的东西。

答案 4 :(得分:0)

product_id