C#睡眠500毫秒

时间:2010-03-27 21:12:30

标签: c# timer sleep

请您告诉我如何暂停我的程序500毫秒然后继续?

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

使用计时器会触发回调......

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

请告知。

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

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

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

6 个答案:

答案 0 :(得分:5)

您有两种选择:

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

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

答案 1 :(得分:5)

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

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

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

该问题的更多背景将有所帮助。

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

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

答案 4 :(得分:2)

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

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

F# async on the client side

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

答案 5 :(得分:0)

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