Я вызываю функцию обновления, чтобы нарисовать симуляцию в реальном времени, и мне интересно, есть ли эффективный способ получить количество миллисекунд, прошедших с момента последнего обновления? На данный момент у меня есть DispatchTimer, вызывающий через регулярные промежутки времени, чтобы обновить симуляцию, но синхронизация недостаточно точна и в конечном итоге примерно на 60% медленнее, чем должна быть (она варьируется).
Способ получить количество миллисекунд в реальном времени, прошедшее с момента последнего вызова метода
Ответы (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
Спасибо, это сработало довольно хорошо, использовал секундомер. 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
Я бы рекомендовал использовать
DateTime.UtcNow
для таких целей, иначе вы получите ложные результаты при изменении часов.
- person jamespconnor; 06.01.2016
System.Diagnostics.StopWatch
. - person jsanalytics   schedule 26.12.2015