c# - 我将如何实现一个 DateTime.UtcNow 因素在调试器暂停?
问题描述
考虑:
public static void Main()
{
DateTime now = DateTime.UtcNow;
String x = Console.ReadLine(); // <-- breakpoint on this line
DateTime then = DateTime.UtcNow;
}
如果我在调用断点的调试器中运行该程序,Console.ReadLine()
并让调试器在手动恢复之前暂停程序 30 秒,那么then
值将是now + 30s
. 这可能会影响调试与时间相关的错误,使用调试器可能无法检测到,因为程序暂停的时间仍然被添加,DateTime.Utc
因为它代表挂钟时间。
我正在寻找一种方法来获得DateTime.UtcNow
好像程序在这 30 秒内没有暂停一样的值,这样我就可以抽象出DateTime.UtcNow
. 例如,如果System.Diagnostics.Debugger
有这个功能:
using System.Diagnostics;
private static DateTime _lastPaused = DateTime.UtcNow;
private static TimeSpan _pauseAdjustment = TimeSpan.Zero;
public static void Main()
{
Debugger.OnPause => { _lastPaused = DateTime.UtcNow; };
Debugger.OnResume => { _pauseAdjustment += DateTime.UtcNow - _lastPaused; };
DateTime now = GetDebuggerUtcNow();
String x = Console.ReadLine(); // <-- breakpoint on this line
DateTime then = GetDebuggerUtcNow();
}
private static DateTime GetDebuggerUtcNow()
{
return DateTime.UtcNow - _pauseAdjustment;
}
这与获取“cpu 时间”不同,因为此值不一定与 CPU 周期数或运行所需的指令数有关,例如,等待异步操作完成所花费的时间。
但是当然,Debugger.OnPause
并且Debugger.OnResume
不存在 - 那么还有另一种方法吗?