在.NET框架中,有没有更好的方法来暂停应用程序而不是使用System.Threading.Thread.Sleep(1000)
?
这不仅会冻结应用程序事件。如何在不导致应用程序冻结或CPU使用率过高的情况下暂停应用程序?
答案 0 :(得分:4)
很难回答你的问题,因为在“暂停”下你的意思并不清楚。
例如,如果这是一个WinForms应用程序,您应该有一个UI窗口。此窗口在Windows内核中存储了很多对象。 (这就是为什么实际上很难使Windows成为仅限控制台的操作系统,微软仅为新的2012服务器版本执行此操作)。有一个全局消息循环将消息分派给所有窗口。这就是您实际查看桌面上所有内容的方式。当然你不想暂停那个消息循环,这会有效地停止Windows并导致未定义的行为/ BSOD /系统挂起状态......
您可能正在考虑暂停应用程序执行的一些用户级代码。在这种情况下,您可以在此处使用某些异步性。
我们假设您进行了大量的素数计算,并且在某些时刻想要暂停/恢复它。
重要!您应该在单独的线程上执行此类工作,保持UI线程可用于处理来自Windows内核的显示通知。
用户可以不时地点击在UI线程中工作的UI元素,然后您可以向工作线程发送暂停/恢复操作。
您可以使用ManualResetEvent
或AutoResetEvent
。这些类专门用于在线程之间传递通知,因此从Windows任务计划程序中删除线程(不需要做任何工作)。
您可以将重置事件视为灯光切换。如果您想完成一些工作,请将其打开。如果要暂停,请将其关闭。当*ResetEvent
处于“OFF”状态时,它不消耗任何CPU,也不执行任何工作。
答案 1 :(得分:2)
使用async
方法:
await Task.Delay(1000);
//or
Task tsk = Task.Delay(1000);
//do work that doesn't depend on the wait
await tsk;