Рассмотрим:
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
не существует - так есть ли другой подход?