Лучший способ справиться с истекшим событием в высокой точке .NET 8.0 TIMERC#

Место общения программистов C#
Ответить
Anonymous
 Лучший способ справиться с истекшим событием в высокой точке .NET 8.0 TIMER

Сообщение Anonymous »

Я строю класс высокого таймера (

Код: Выделить всё

QuickTickTimer
) в .net 8.0, смоделировано после System.timers.timer , но реализовано с низкоуровневыми примитивами Windows (например, IOCP и NTWAIT* API) для точности подмены и низкой дрожания. https://devblogs.microsoft.com/go/high- ... s-windows/
Моего кода можно найти здесь:

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);
}
}
}
}
Я в настоящее время вызываю событие upped внутри цикла завершения, которое ожидает новых событий; Это так или иначе работает, но мне не нравится решение по нескольким причинам: < /p>

Таймер может надежно снижаться до 2 мс, но когда мой вызываемый метод занимает больше 2 мс в некоторых случаях, то это замедляет таймер и влияет на точность времени. от истешенного , потому что STOP () ждет, пока поток закроется, вызывая тупик. Тем не менее, System.Timers.Timer позволяет вызовать stop () из любого места. необходимо. < /p>
Я думаю, что здесь есть несколько решений. Моим любимым было бы вообще не понадобится поток opplionLoop , но нет никакой функции API Windows, которая бы вызовет обратные вызовы напрямую с точностью этого метода (по крайней мере, о том, о чем я знаю). Другим решением будет использование второго потока для выполнения метода Elapsed события или просто позволить ему выполнить в ThreadPool ; Я уверен, что есть еще больше потенциальных решений.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -8-0-timer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»