[英]C# - Alternative to Thread.Sleep?
我正在Visual Studio 2008中的C#中完成所有这些工作。
我想放慢算法的工作,以便用户可以观看它的工作。 GUI上有一个可见的定期更改,因此我在每个实例之后添加了“ thread.sleep”。
问题是,在几个“ thread.sleep”实例(经过几次循环)之后,将“ thread.sleep”设置为至少一秒钟后,它会冻结整个GUI,并保持这种状态直到程序完成。 不是马上就发生,但总是会发生。 多久取决于睡眠时间。
我有证据表明,整个程序不会冻结,它可以正常工作,即使睡眠正在按正确的长度暂停。 但是GUI会冻结在特定点,直到算法结束为止,在该点它会显示正确的最终状态。
如何解决这个问题? 在某些时候可以替代暂停算法?
我猜所有事情都用完了一个线程。 用户可能通过单击按钮或类似的按钮来调用此算法。 这由您的主线程的消息队列处理。 在此事件处理程序返回之前,您的应用程序的GUI无法更新。 它需要定期抽取消息队列以保持响应。
睡眠几乎从来不是一个好主意,在GUI线程中绝对不是一个好主意。 我不建议您继续使用睡眠状态,并通过调用Application.DoEvents使GUI响应。
相反,您应该在后台线程中运行此算法,并在完成时将其发送给主线程。
您将提交一些相当常见的用户界面blooper:
代替:
这取决于很多事情,因此很难根据您所说的给出具体答案。 不过,以下是一些可能相关的事项:
您是否在UI线程上执行此操作(例如,触发工作开始的表单按钮或UI事件的线程)? 如果是这样,最好创建一个新线程来执行工作。
你为什么要睡觉 如果与正在进行的工作相关的状态可用于所有相关线程,那么观察者是否可以不使工作线程处于睡眠状态而仅观察到这种情况? 也许工作线程可以将当前进度的指示符写入易失性或锁定变量(如果它大于指针大小(例如,int或对象),则必须锁定,但不能以其他方式锁定。如果未锁定,则易失性将阻止缓存CPU之间的不一致,尽管这可能没什么大不了的)。 在这种情况下,您可以有一个表单计时器(.Net中有不同用途的不同计时器),可以检查该变量的状态并更新UI以反映正在完成的工作,而工作线程无需执行任何操作。 有时,这对工作线程中的Yield()
可能最多是有益的,但是甚至不需要这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.