首页 > 解决方案 > 我将如何实现一个 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不存在 - 那么还有另一种方法吗?

标签: c#.netdebuggingtime

解决方案


推荐阅读