/// <summary> /// This is a thread worker. It performs the continuous animation until Stop is called. /// </summary> private void AnimateContinuosly() { IsPendingStop = false; var startFrameTime = DateTime.UtcNow; using (var tickLock = new ManualResetEvent(false)) { while (IsPendingStop == false) { startFrameTime = DateTime.UtcNow; FrameNumber = (FrameNumber == UInt64.MaxValue) ? 1 : FrameNumber + 1; lock (SyncLock) { CurrentAnimation.PaintNextFrame(); LedStrip.Render(); } var elapsedToFrame = MillisecondsPerFrame - Convert.ToInt32(DateTime.UtcNow.Subtract(startFrameTime).TotalMilliseconds); if (elapsedToFrame <= 0) { $"Frames are lagging. Increase the frequency or simplify the rendering logic.".Warn(); // typeof(LedStripWorker)); continue; } else { tickLock.WaitOne(elapsedToFrame); } } } IsPendingStop = false; }