在.net中计时执行时间,忽略操作系统休眠时间



我们试图在应用程序中加入一些计时代码,但遇到了一个潜在的问题。我们希望定时是健壮的,以便在计算机休眠期间,定时暂停,给我们一个更精确的活动使用时间。我们一直在使用各种BCL和P/Invoke方法(环境)。TickCount DateTime。UtcNow, Stopwatch, QueryPerformanceCounter(我认为Stopwatch在内部使用,如果可用)和timeGetTime(来自winnm.dll, mmtimer.dll或core.dll)),但它们都在休眠计算机时继续计数。

是否有任何健壮的BCL或p/Invoke调用将计算实际执行时间并在操作系统休眠时暂停?

我想另一种方法可能是使用上述方法之一,并维护一个内部周期性刻度,可以解释计时中的"漏洞"(可以指示休眠周期),但这似乎有点麻烦,而且易于实现和验证。

编辑:根据要求,我将添加一些背景。我们正在创建一个小库来计时应用程序中的特性使用。我们希望避免依赖第三方解决方案,因此我们需要坚持BCL(或P/Invoke,尽管我们希望避免这种情况)中的某些内容。我们收到了一些反馈,我们的一些计时方式偏离了,并且发现我们没有意识到这样一个事实,即我们的计时代码对于操作系统中的休眠并不健壮。因此,我们正在寻找一个解决方案,以提供实际程序的执行时间。我们不是寻找CPU使用率或类似的低级计数器,我们想要一种方法来衡量该特性的实际执行时间,我们不认为休眠操作系统是执行时间。

可以在系统休眠时注册通知,使用函数RegisterSuspendResumeNotification:

  • https://learn.microsoft.com/en-gb/windows/desktop/api/winuser/nf-winuser-registersuspendresumenotification

您可能还希望在工作站被锁定、屏幕保护程序运行或桌面使用快速用户切换切换用户时接收通知,使用系统事件通知服务:

  • https://learn.microsoft.com/en-us/windows/desktop/api/sensevts/nf-sensevts-isenslogon-displayunlock

最新更新