Я создал небольшое инженерное приложение для некоторой сетевой отладки. Он берет список IP-адресов и пингует их с установленным пользователем таймаутом и скоростью. Он регистрирует среднее время приема-передачи и каждый раз, когда одна из посылов терпит неудачу, регистрирует продолжительность отказа и временную метку, когда это произошло ...
Это идея. Я разработал его на машине Win7 с расширением.Net4 и пришлось ставить эту штуку на набор ноутбуков XP.
Проблема в том, что значения длительности на моем поле во время тестирования показывают хорошую длительность в миллисекундах, на окнах XP, когда я смотрю, они показывают 0 или 15,625 (магическое число?) ... и имеют забавный квадрат, символ прямоугольника в строке ?
public void LinkUp()
{
if (_isLinkUp) return;
_upTime = DateTime.Now;
var span = _upTime.Subtract(_downTime);
_downTimeLog.Add(new LinkDown()
{
_span = span,
_status = _ipStatus,
_time = _downTime
});
_isLinkUp = true;
}
Это бит, который ведет журнал. _IpStatus - это причина сбоя проверки связи (обычно тайм-аут).
_downEventLog.AppendLine(" Duration-> " + linkDownLogEvent._span.TotalMilliseconds + "ms\n");
Это то, что делает печать ... Может ли кто-нибудь пролить свет на эту очевидную разницу?
На вопрос был дан ответ, но я добавлю здесь правку для получения дополнительной информации.
РЕДАКТИРОВАТЬ:
Кажется, разница заключалась не в разнице Win7 и WinXP, а в 32- и 64-битных версиях.
В 32-битных системах Windows, как указывает Хенк , степень детализации системных часов составляет 15-16 мс, это то, что дало мне значение 15,625 для каждого значения меньше 16 мс для временного интервала.
В 64-битной системе системный вызов относится к другому набору методов, которые имеют гораздо более мелкую детализацию. Итак, на моей машине разработчика в x64 у меня была точность в мс по моим системным часам!
Теперь секундомер использует аппаратный интерфейс через инструментарий процессора для записи гораздо более тонкой детализации (возможно, не каждого такта процессора, но я представляю себе что-то до неприличия точным в соответствии с этим мышлением). Если оборудование, лежащее в основе ОС, не имеет этого уровня инструментовки, оно, тем не менее, будет использовать системное время. Так что будьте осторожны! Но я предполагаю, что большинство современных настольных компьютеров / ноутбуков имеют это оборудование ...Встроенные устройства или подобные вещи могут и не быть, но тогда, насколько я могу судить, класса секундомера нет в Compact Framework (здесь вы должны использовать QueryPerformanceCounter ()).
Надеюсь, все это поможет. Это мне очень помогло.
Где-то рядом с инициализатором _spanStopWatch:
if (!_spanStopWatch.IsHighResolution)
{
throw new ThisMachineIsNotAccurateEnoughForMyLikingException("Find a better machine.");
}
Гайки и болты:
public void LinkUp()
{
if (_isLinkUp) return;
_spanStopWatch.Stop();
var span = _spanStopWatch.Elapsed;
_downTimeLog.Add(new LinkDown()
{
_span = span,
_status = _ipStatus,
_time = _downTime
});
_isLinkUp = true;
}