如何在不使用睡眠的情况下在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 。
您的示例中需要做的是:
- 确保您的程序将.Net Framework 4.5作为目标框架
- 使用
async
关键字标记需要睡眠的函数(请参阅下面的示例) -
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(); } }