0

在 .NET 框架中,有没有更好的方法来暂停应用程序而不是使用System.Threading.Thread.Sleep(1000).

这不仅冻结了应用程序事件。如何暂停应用程序而不导致它冻结或获得高 CPU 使用率?

4

2 回答 2

4

很难回答你的问题,因为不清楚“暂停”是什么意思。

什么不是暂停

例如,如果这是一个 WinForms 应用程序,您应该有一个 UI 窗口。这个窗口有很多对象存储在 Windows 内核深处。(这就是为什么实际上很难让 Windows 成为一个仅限控制台的操作系统,微软只为新的 2012 服务器版本这样做)。有一个全局消息循环将消息分派到所有窗口。这就是您实际查看桌面上所有内容的方式。当然,您不想暂停该消息循环,这会有效地停止 Windows 并导致未定义的行为/BSOD/系统挂起状态......

这是什么

您可能正在考虑暂停应用程序执行的一些用户级代码。在这种情况下,您可以在此处使用一些异步性。

假设您进行了大量的素数计算,并且在某个时刻想要暂停/恢复它。

重要的!您应该在单独的线程上执行此类工作,保持 UI 线程可用于处理来自 Windows 内核的显示通知。

有时,用户可以单击在 UI 线程中工作的 UI 元素,然后您可以向工作线程发送暂停/恢复操作。

兵工厂

您可以使用ManualResetEventAutoResetEvent。这些类专门设计用于在线程之间传递通知,因此从 Windows 任务计划程序中删除线程(不需要做任何工作)。

您可以将重置事件视为灯的开关。当您想要完成一些工作时,您将其打开。如果要暂停,请将其关闭。当*ResetEvent处于“关闭”状态时,它不消耗任何 CPU 并且不执行任何工作。

于 2013-08-09T13:22:25.703 回答
2

在一个async方法中:

await Task.Delay(1000);
//or 
Task tsk = Task.Delay(1000);
//do work that doesn't depend on the wait
await tsk;
于 2013-08-09T11:45:16.577 回答