In C# kann die System.Timer-Klasse verwendet werden, um einen Timer zu erstellen, der in bestimmten Intervallen ein Ereignis auslöst. Die System.Timer-Klasse hat jedoch eine begrenzte Auflösung und ist möglicherweise nicht für Anwendungen geeignet, die hochauflösendes Timing erfordern.
Um einen hochauflösenden Timer zu erstellen, der in einem bestimmten Intervall ein Ereignis auslöst, können Sie verwenden die Multimedia-Timer-API. Die Multimedia-Timer-API ist eine Windows-API, die einen hochauflösenden Timer bereitstellt, mit dem Ereignisse in Intervallen von nur 1 Millisekunde ausgelöst werden können.
Um einen hochauflösenden Timer mit der Multimedia-Timer-API zu erstellen, müssen Sie kann den folgenden Code verwenden:
using System.Runtime.InteropServices; public class HighResolutionTimer { private bool disposed = false; private int interval, resolution; private UInt32 timerId; // Hold the timer callback to prevent garbage collection. private readonly MultimediaTimerCallback Callback; public HighResolutionTimer() { Callback = new MultimediaTimerCallback(TimerCallbackMethod); Resolution = 5; Interval = 10; } ~HighResolutionTimer() { Dispose(false); } public int Interval { get { return interval; } set { CheckDisposed(); if (value < 0) throw new ArgumentOutOfRangeException("value"); interval = value; if (Resolution > Interval) Resolution = value; } } // Note minimum resolution is 0, meaning highest possible resolution. public int Resolution { get { return resolution; } set { CheckDisposed(); if (value < 0) throw new ArgumentOutOfRangeException("value"); resolution = value; } } public bool IsRunning { get { return timerId != 0; } } public void Start() { CheckDisposed(); if (IsRunning) throw new InvalidOperationException("Timer is already running"); // Event type = 0, one off event // Event type = 1, periodic event UInt32 userCtx = 0; timerId = NativeMethods.TimeSetEvent((uint)Interval, (uint)Resolution, Callback, ref userCtx, 1); if (timerId == 0) { int error = Marshal.GetLastWin32Error(); throw new Win32Exception(error); } } public void Stop() { CheckDisposed(); if (!IsRunning) throw new InvalidOperationException("Timer has not been started"); StopInternal(); } private void StopInternal() { NativeMethods.TimeKillEvent(timerId); timerId = 0; } public event EventHandler Elapsed; public void Dispose() { Dispose(true); } private void TimerCallbackMethod(uint id, uint msg, ref uint userCtx, uint rsv1, uint rsv2) { var handler = Elapsed; if (handler != null) { handler(this, EventArgs.Empty); } } private void CheckDisposed() { if (disposed) throw new ObjectDisposedException("MultimediaTimer"); } private void Dispose(bool disposing) { if (disposed) return; disposed = true; if (IsRunning) { StopInternal(); }
Das obige ist der detaillierte Inhalt vonWie erstelle ich einen hochauflösenden Timer in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!