我对编程非常陌生,到目前为止,我一直学得很好,我想,但我仍然无法理解按照我想要的方式做出延迟的想法。我正在研究的是使用涉及战斗系统的Windows表单应用程序的一种测试“游戏”。在其中,我想让NPC每隔几秒钟做一次动作。问题是,我还想让玩家在攻击之间进行交互。 Thread.sleep似乎对我不起作用,不仅因为我不知道如何多线程,而且每当我尝试运行它时,比如说:
textBox1.Text += "\r\nThread Sleeps!";
System.Threading.Thread.Sleep(4000);
textBox1.Text += "\r\nThread awakens!";
似乎坚持先睡觉,然后打印两条线。
我认为现在我只能这么说,但如果那仍然太模糊或罗嗦,请随时告诉我。
简而言之,在C#中我希望在运行之前做出一些延迟,但同时仍允许用户交互。
答案 0 :(得分:56)
如果您使用的是.NET 4.5,则可以使用新的async / await框架在不锁定线程的情况下进入休眠状态。
它的工作原理是使用async
关键字标记需要异步操作的函数。这只是编译器的一个提示。然后在您希望代码异步运行的行上使用await
关键字,程序将在不锁定线程或UI的情况下等待。您调用的方法(在等待行上)也必须使用async
关键字标记,并且通常以Async结尾命名,如 ImportFilesAsync 。
您的示例中需要做的是:
async
关键字标记您需要睡眠的功能(请参阅下面的示例)using System.Threading.Tasks;
添加到您的代码中。您的代码现已准备好使用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.Delay和Await。
答案 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