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

标签 c# timer delay sleep

我对编程非常陌生,我认为到目前为止我已经学得很好,但我仍然无法理解按我想要的方式进行延迟的想法。我正在做的是一种使用涉及战斗系统的 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

你需要在你的例子中做的是:

  1. 确保您的程序将 .Net Framework 4.5 作为目标框架
  2. async 关键字标记需要休眠的函数(参见下面的示例)
  3. 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/

相关文章:

c# - 如何实现每小时运行一次但也可以从 .aspx 页面触发的作业?

javascript - 你如何在计时器中调用启动和停止功能

java - 延迟 boolean 值切换回 false

jquery - 如果 ajax 花费的时间少于 X 秒,如何延迟显示进度?

tomcat - Java EE 中的定时批处理有哪些工具?

android - KitKat 在第一次调用时比 Froyo 多花 6 秒对 TextToSpeech.speak() 使用react

c# - MySqlDataReader: DataTable.Fill(reader) 抛出 ConstraintException

C# - 用另一个数组分割数组

c# - 如何为音频剪辑的长度实例化对象

c# - 拦截MS Windows的 'SendTo'菜单调用?