Код: Выделить всё
QuickTickTimerМоего кода можно найти здесь:
https://github.com/uight/quicktick br/> Пополнение кода, которое я не знаю, что я не знаю, что я не знаю, что я не знаю, что я не знаю, что я не знаю, что я не знаю, что я не знаю, что я не могу Пакет (см. Ниже). < /P>
Фактический вопрос об этой части: < /p>
Код: Выделить всё
private void CompletionThreadLoop()
{
while (isRunning)
{
if (Win32Interop.GetQueuedCompletionStatus(iocpHandle, out _, out var lpCompletionKey, out _, uint.MaxValue))
{
if (lpCompletionKey == successCompletionKey)
{
var actualFireTime = DateTime.UtcNow;
var scheduledFireTime = new DateTime(nextFireTime, DateTimeKind.Utc);
var elapsedEventArgs = new QuickTickElapsedEventArgs(actualFireTime, scheduledFireTime);
if (autoReset)
{
nextFireTime += intervalTicks;
SetTimer();
}
else
{
isRunning = false;
if (timerHandle != IntPtr.Zero)
{
Win32Interop.CancelWaitableTimer(timerHandle);
}
}
elapsed?.Invoke(this, elapsedEventArgs);
}
}
}
}
Таймер может надежно снижаться до 2 мс, но когда мой вызываемый метод занимает больше 2 мс в некоторых случаях, то это замедляет таймер и влияет на точность времени. от истешенного , потому что STOP () ждет, пока поток закроется, вызывая тупик. Тем не менее, System.Timers.Timer позволяет вызовать stop () из любого места. необходимо. < /p>
Я думаю, что здесь есть несколько решений. Моим любимым было бы вообще не понадобится поток opplionLoop , но нет никакой функции API Windows, которая бы вызовет обратные вызовы напрямую с точностью этого метода (по крайней мере, о том, о чем я знаю). Другим решением будет использование второго потока для выполнения метода Elapsed события или просто позволить ему выполнить в ThreadPool ; Я уверен, что есть еще больше потенциальных решений.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -8-0-timer
Мобильная версия