Cet article détaille la création d'un minuteur haute résolution en C# qui déclenche un événement à des intervalles spécifiés, offrant un contrôle plus fin que la classe System.Timer
standard. Nous explorerons les limites des options .NET existantes et présenterons une solution utilisant l'API Windows Multimedia Timer.
Bien que la classe Stopwatch
fournisse une mesure du temps haute résolution, elle n'est pas conçue pour déclencher des événements à des intervalles précis. Le framework .NET lui-même n’a pas d’équivalent direct à nos besoins. Par conséquent, nous exploiterons l’API Windows Multimedia Timer, qui est optimisée pour la synchronisation des événements.
Vous trouverez ci-dessous une implémentation C# utilisant l'API Multimedia Timer :
<code class="language-csharp">using System; using System.Runtime.InteropServices; class MultimediaTimer : IDisposable { private bool disposed = false; private int interval, resolution; private uint timerId; private readonly MultimediaTimerCallback Callback; public delegate void MultimediaTimerCallback(uint uTimerID, uint uMsg, IntPtr dwUser, uint dw1, uint dw2); public event EventHandler<EventArgs> TimerElapsed; public MultimediaTimer() { Callback = new MultimediaTimerCallback(TimerCallbackMethod); Resolution = 5; // Default resolution (milliseconds) Interval = 10; // Default interval (milliseconds) } ~MultimediaTimer() { Dispose(false); } public int Interval { get { return interval; } set { CheckDisposed(); if (value > 0) interval = value; } } public int Resolution { get { return resolution; } set { CheckDisposed(); if (value > 0 && value <= interval) resolution = value; } } public void Start() { CheckDisposed(); uint result = timeSetEvent((uint)interval, (uint)resolution, Callback, IntPtr.Zero, 1); if (result == 0) throw new Exception("Failed to start timer."); timerId = result; } public void Stop() { CheckDisposed(); if (timerId != 0) timeKillEvent(timerId); timerId = 0; } private void TimerCallbackMethod(uint uTimerID, uint uMsg, IntPtr dwUser, uint dw1, uint dw2) { TimerElapsed?.Invoke(this, EventArgs.Empty); } private void CheckDisposed() { if (disposed) throw new ObjectDisposedException("MultimediaTimer"); } protected virtual void Dispose(bool disposing) { if (!disposed) { Stop(); disposed = true; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } [DllImport("winmm.dll")] private static extern uint timeSetEvent(uint uDelay, uint uResolution, MultimediaTimerCallback lpTimeProc, IntPtr dwUser, uint fuEvent); [DllImport("winmm.dll")] private static extern uint timeKillEvent(uint uTimerID); }</code>
Considérations importantes :
L'API Multimedia Timer interagit avec les paramètres à l'échelle du système ; des ajustements pourraient affecter les performances du système. Surveillez la fréquence de la minuterie pour vous assurer qu’elle correspond à l’intervalle cible. N'oubliez pas que Windows n'est pas un système d'exploitation en temps réel, la charge du système peut donc avoir un impact sur la précision du minuteur.
L'API Multimedia Timer fournit un mécanisme puissant pour créer des minuteries haute résolution avec une signalisation basée sur les événements en C#, répondant aux scénarios dans lesquels un timing précis est essentiel. Bien qu'il ne s'agisse pas d'une fonctionnalité native de .NET, ses capacités en font un outil précieux pour des exigences de synchronisation spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!