Обновление (после просмотра вашего журнала)
Как вы уже упоминали, класс Stopwatch
использует функцию QueryPerformanceCounter
внизу.В разделе Замечания MSDN гласит:
На многопроцессорном компьютере не должно иметь значения, какой процессор вызывается.Однако вы можете получить разные результаты на разных процессорах из-за ошибок в базовой системе ввода / вывода (BIOS) или на уровне абстрагирования оборудования (HAL).Чтобы указать привязку процессора к потоку, используйте функцию SetThreadAffinityMask.
Поскольку вы используете Диспетчер, QueryPerformanceCounter
может не выполняться на одном и том же ЦП каждый раз, когда вы запрашиваете истекшее время.
Вы можете проверить, упоминалась ли проблемав MSDN причина вашей проблемы, указав привязку процессора к вашему процессу, например, вызвав ваш исполняемый файл с помощью команды start
.Мне кажется, что 10 секунд - большая задержка между процессорами, но документация о том, насколько велика разница, очень расплывчата.Следующая команда свяжет ваше приложение с первым процессором:
> start.exe /AFFINITY 1 program.exe
Если это решит проблему, вы можете захотеть взглянуть на предлагаемый обходной путь, то есть вызвать функцию SetThreadAffinityMask
перед запросом Stopwatch
объект.
В вашем комментарии сказано, что вы используете WPF DispatcherTimer
. документация этого класса гласит:
Таймеры не гарантированно работают точно, когда временной интервал наступает , но онигарантированно не будет выполнено до наступления временного интервала.Это связано с тем, что операции DispatcherTimer помещаются в очередь Dispatcher, как и другие операции.Время выполнения операции DispatcherTimer зависит от других заданий в очереди и их приоритетов.
Это означает, что событие таймера может поступить с задержкой, особенно если диспетчер занят другими задачами.Вы поместили другие вещи в очередь диспетчера, которые будут препятствовать тому, чтобы событие вызвало ранее?