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

use*_*003 28 c# sleep timer delay

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

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

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

我想这就是我现在可以说的全部内容,但如果这仍然太模糊或冗长,请随时告诉我.

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

Ohl*_*lin 59

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

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

您在示例中需要做的是:

  1. 确保您的程序将.Net Framework 4.5作为目标框架
  2. 使用async关键字标记需要睡眠的功能(参见下面的示例)
  3. 添加using System.Threading.Tasks;到您的代码中.

您的代码现在已准备好使用该Task.Delay方法而不是System.Threading.Thread.Sleep方法(可以使用awaiton,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!";
}
Run Code Online (Sandbox Code Playgroud)

在这里,你可以阅读更多有关Task.Delay等待.


小智 5

通过添加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) { };
}
Run Code Online (Sandbox Code Playgroud)

延迟是一个函数,可以像这样使用:

delay(5000);
Run Code Online (Sandbox Code Playgroud)

  • 任何使用此代码的人请注意:/sf/answers/3000425081/ (2认同)