public unsafe void Start() { lock (stateLock) { if (!Enabled) { if (IsSupportedNatively(Interval)) { var caps = new TimeCaps(); _ = timeGetDevCaps(ref caps, (uint)sizeof(TimeCaps)); var clampedInterval = Math.Clamp((uint)Interval, caps.wPeriodMin, caps.wPeriodMax); _ = timeBeginPeriod(clampedInterval); timerId = timeSetEvent(clampedInterval, 1, callbackDelegate, IntPtr.Zero, EventType.TIME_PERIODIC | EventType.TIME_KILL_SYNCHRONOUS); Enabled = true; } else { Log.Write("Timer", "Unsupported interval detected, will use fallback timer. Expect high CPU usage", LogLevel.Warning); fallbackTimer = new FallbackTimer { Interval = Interval }; fallbackTimer.Elapsed += () => Elapsed?.Invoke(); fallbackTimer.Start(); Enabled = true; } } } }
public void Stop() { lock (stateLock) { if (Enabled) { if (fallbackTimer == null) { _ = timeKillEvent(timerId); _ = timeEndPeriod((uint)Interval); } else { fallbackTimer.Stop(); fallbackTimer = null; } Enabled = false; } } }