C#睡眠500毫秒

你能否告诉我如何暂停我的程序500毫秒然后继续?

我读Thread.Sleep(500)并不好,因为它阻止了GUI线程。

使用计时器它会触发回调……

我只想等待500毫秒然后继续下一个声明。

请指教。

编辑:我需要显示状态栏消息500毫秒,然后用另一个消息更新消息。 对不起,我的意思是500不是50。

编辑:我明白你所说的一切。 但是:[我只想等待500ms,然后继续下一个声明。]我认为因为它是如此短暂的间隔我将在主GUI线程上执行Thread.Sleep(500)。 否则我将不得不重写大量代码以适应500毫秒的这个短暂间隔。

编辑:我将尝试重新格式化我的状态消息,因此不需要暂停。

Hmya,你要做的事情与Windows编程模型完全不相容。 本机Windows程序是事件驱动的。 你的程序总是处于空闲状态,坐在由Application.Run()启动的循环中,等待Windows告诉它发生了应该响应的有趣事情。 绘制请求,鼠标点击,计时器到期,类似的东西。

您的程序应该对此做出响应并过滤您感兴趣的内容。 当您在表单上删除按钮时,您始终对Windows发送MouseDown通知消息时生成的Click事件感兴趣。 您的Click事件处理程序运行您编写的某种自定义代码。 就像在你的情况下更新状态栏消息一样。

半秒后更新状态栏消息并不能完全理解。 在500毫秒内改变了程序响应事件的方式究竟发生了什么? 您可以调用StatusBar的Update()方法以使新消息可见,然后调用System.Threading.Thread.Sleep(500)以获得所需内容。 你会侥幸逃脱它,Windows提出的“无响应”幽灵让你的程序死了好几秒钟。

但这没有多大意义,在那半秒内没有发生任何事情,你的计划状态没有改变。 它无法改变,它已经死了Windows并且没有收到任何允许它改变状态的消息。

嗯,这就是我可以接受的。 请更新您的问题并说明您需要执行此操作的原因。 以防万一:如果你正在考虑假装做一些重要的事情半秒钟,你的用户将不会留下深刻的印象。 她最终会注意到你的用户界面已经死了半秒钟而没有任何东西可以显示它。

你有两个选择:

  • 按照建议使用计时器。 将您的方法拆分为两个方法,foo1和foo2。 使用foo1启动计时器并在回调中运行foo2。
  • 使用BackgroundWorker运行整个函数,并在工作线程上使用Thread.Sleep。

从您的更新看来,您唯一想做的就是更改单个字段。 我肯定会推荐第一种方法:使用计时器。 为此任务启动BackgroundWorker是过度的,只会给你不必要的额外工作和复杂性。

您可以始终使用BackgroundWorker ,而不是直接暂停UI 500毫秒。 这将导致您的回调在单独的线程中运行,您可以使用Thread.Sleep暂停它而不阻止UI。 完成后,只需使用新消息更新状态栏即可。

这个问题的更多背景将是有帮助的。

Thread.Sleep(50)将暂停当前线程50毫秒。 如果你在UI线程中这样做,那么是的,它将冻结UI 50毫秒。 但是,如果使用其他线程来执行此处理,则在该线程上调用Sleep将暂停50毫秒而不冻结UI线程。

有关使用BackgroundWorker实例执行所需操作的示例,请参阅Marc 对此问题的回答。

在C#中,您最好的选择是使用Timer并触发回调。

在F#中有一种很棒的方法可以做你想做的事,看看

客户端的F#异步

它显示了如何编写直线代码并让语言为您处理回调。

您需要分配另一个线程。 在该线程中,您Sleep(500)并更改所需的数据。 警告:您需要使用原始线程的调度程序,因为与UI相关的数据通常应该从GUI线程更新。