Dieser Artikel beschreibt die Erstellung eines hochauflösenden Timers in C#, der in bestimmten Intervallen ein Ereignis auslöst und eine feinere Kontrolle als die Standardklasse System.Timer
bietet. Wir untersuchen die Einschränkungen bestehender .NET-Optionen und präsentieren eine Lösung mithilfe der Windows Multimedia Timer API.
Während die Stopwatch
-Klasse eine hochauflösende Zeitmessung bietet, ist sie nicht für die Ereignisauslösung in präzisen Intervallen konzipiert. Dem .NET-Framework selbst fehlt ein direktes Äquivalent zu unseren Anforderungen. Daher nutzen wir die Windows-Multimedia-Timer-API, die für das Ereignis-Timing optimiert ist.
Unten ist eine C#-Implementierung unter Verwendung der Multimedia-Timer-API:
<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>
Wichtige Überlegungen:
Die Multimedia-Timer-API interagiert mit systemweiten Einstellungen; Anpassungen könnten sich auf die Systemleistung auswirken. Überwachen Sie die Timerfrequenz, um sicherzustellen, dass sie dem Zielintervall entspricht. Denken Sie daran, dass Windows kein Echtzeitbetriebssystem ist, daher kann die Systemlast die Timer-Genauigkeit beeinträchtigen.
Die Multimedia-Timer-API bietet einen leistungsstarken Mechanismus zum Erstellen hochauflösender Timer mit ereignisbasierter Signalisierung in C# und adressiert Szenarien, in denen präzises Timing von entscheidender Bedeutung ist. Obwohl es sich nicht um eine native .NET-Funktion handelt, ist es aufgrund seiner Fähigkeiten ein wertvolles Werkzeug für spezifische Timing-Anforderungen.
Das obige ist der detaillierte Inhalt vonWie kann ich in C# einen hochauflösenden Timer mit ereignisbasierter Intervallsignalisierung erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!