我对编程非常陌生,我认为到目前为止我已经学得很好,但我仍然无法理解按我想要的方式进行延迟的想法。我正在做的是一种使用涉及战斗系统的 Windows 窗体应用程序的测试“游戏”。在其中,我想制作一个每隔几秒执行一次 Action 的 NPC。问题是,我还想让玩家在攻击之间进行交互。 Thread.sleep 似乎真的对我不起作用,不仅因为我不知道如何进行多线程,而且每当我尝试运行它时,就像这样:
textBox1.Text += "\r\nThread Sleeps!";
System.Threading.Thread.Sleep(4000);
textBox1.Text += "\r\nThread awakens!";
好像坚持先休眠,再打印两行。
我想这就是我目前能说的全部内容,但如果仍然太含糊或冗长,请随时告诉我。
简而言之,在 C# 中,我想在运行前做一些延迟,但同时仍允许用户交互。
最佳答案
如果您使用的是 .NET 4.5,则可以使用新的 async/await 框架在不锁定线程的情况下休眠。
它的工作原理是使用 async
关键字标记需要异步操作的函数。这只是对编译器的提示。然后在您希望代码异步运行的行上使用 await
关键字,您的程序将等待而不锁定线程或 UI。您调用的方法(在 await 行上)也必须用 async
关键字标记,并且通常命名为以 Async 结尾,如 ImportFilesAsync。
你需要在你的例子中做的是:
- 确保您的程序将 .Net Framework 4.5 作为目标框架
- 用
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 .
关于c# - 如何在不使用 sleep 的情况下在 C# 中执行短暂的延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18372355/