Как мне реализовать DateTime.UtcNow, который учитывает отладчик? - PullRequest
0 голосов
/ 28 октября 2018

Рассмотрим:

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;
}

Это не то же самое, что получить «время процессора», потому что это значение не обязательно имеет отношение к числу циклов ЦП или инструкцийнапример, на выполнение потребовалось время, затраченное на ожидание завершения асинхронной операции.

Но, конечно, Debugger.OnPause и Debugger.OnResume не существует - так есть ли другой подход?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...