Способ получить количество миллисекунд в реальном времени, прошедшее с момента последнего вызова метода

Я вызываю функцию обновления, чтобы нарисовать симуляцию в реальном времени, и мне интересно, есть ли эффективный способ получить количество миллисекунд, прошедших с момента последнего обновления? На данный момент у меня есть DispatchTimer, вызывающий через регулярные промежутки времени, чтобы обновить симуляцию, но синхронизация недостаточно точна и в конечном итоге примерно на 60% медленнее, чем должна быть (она варьируется).


person Jamie Mair    schedule 26.12.2015    source источник
comment
Попробуйте System.Diagnostics.StopWatch.   -  person jsanalytics    schedule 26.12.2015
comment
Я написал часы в этом ответе: -updating-every-second/33967889#33967889" title="как показать часы в форме wpf, которая показывает hms и обновляет каждую секунду"> stackoverflow.com/questions/33967369/   -  person AnjumSKhan    schedule 26.12.2015


Ответы (2)


Я бы использовал Stopwatch.GetTimestamp(), чтобы получить количество тиков, а затем сравнить значение до и после. Вы можете преобразовать это в тайминги:

var startTicks = Stopwatch.GetTimestamp();
// Do stuff
var ticks = Stopwatch.GetTimestamp() - startTicks;

double seconds = ticks / Stopwatch.Frequency;
double milliseconds = (ticks / Stopwatch.Frequency) * 1000;
double nanoseconds = (ticks / Stopwatch.Frequency) * 1000000000;

Вы также можете использовать var sw = Stopwatch.StartNew(); и sw.Elapsed.TotalMilliseconds впоследствии, если вы просто хотите синхронизировать разные фрагменты кода.

person jamespconnor    schedule 26.12.2015
comment
Спасибо, это сработало довольно хорошо, использовал секундомер. ElapsedTicks для измерения количества тиков. - person Jamie Mair; 27.12.2015

Сохраняйте переменную, которая не будет сбрасываться между вызовами.
Возможно, вам не обязательно быть статической, как у меня.

private static DateTime _LastLogTime = DateTime.Now;

Затем в методе:

// This ensures only the exact one Tick is used for subsequent calculations
// Instead of calling DateTime.Now again and getting different values
DateTime NewTime = DateTime.Now;

TimeSpan ElapsedTime = NewTime - _LastLogTime;
_LastLogTime = NewTime;

string LogMessage = string.Format("{0,7:###.000}", ElapsedTime.TotalSeconds);

Мне понадобилось только тысячную долю секунды в моей строке, но вы можете получить гораздо более точную информацию с полученным TimeSpan.

Также есть значение .TotalMilliseconds или даже .Ticks (наиболее точное) доступное в результирующем интервале времени.

person Don    schedule 26.12.2015
comment
Я бы рекомендовал использовать DateTime.UtcNow для таких целей, иначе вы получите ложные результаты при изменении часов. - person jamespconnor; 06.01.2016