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

 Таймер может надежно снизить до 2 мс, когда мой вызываемый метод действительно занимает больше 2 мс. тупик. Однако System.Timers.Timer 
позволяет вызовать остановку из любого места. /> Я думаю, что здесь есть несколько решений. Моим любимым было бы не понадобиться нить завершения Loploop вообще, но нет никакой функции API WIN, которая бы снимала обратные вызовы напрямую с точностью, если эти методы (по крайней мере, я знаю). Другими решениями будут использование второго потока для выполнения метода изданного события или просто позволить ему выполнить в TreadPool; Я уверен, что есть еще более потенциальные решения.>

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

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

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

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

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

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