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

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

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

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

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

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

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

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

您的示例中需要做的是:

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

您的代码现在已准备好使用Task.Delay方法而不是System.Threading.Thread.Sleep方法(可以在Task.Delay上使用await ,因为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.Delay和Await的更多信息。

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

在对textbox1进行更改后,需要强制程序进行图形更新。 你可以通过调用Update();来做到这一点Update();

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

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

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

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

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

 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) { }; } 

延迟是一个function,可以像:

 delay(5000); 

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

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

 private void WaitNSeconds(int seconds) { if (seconds < 1) return; DateTime _desired = DateTime.Now.AddSeconds(seconds); while (DateTime.Now < _desired) { Thread.Sleep(1); System.Windows.Forms.Application.DoEvents(); } }