/// <inheritdoc /> public void DispatchNext() { IBeatEvent beatEvent = null; //Must lock around the isReady check to prevent potential dequeue races. lock (syncObj) { //Check if we're ready if (!isBeatEventReady) { throw new InvalidOperationException($"Requested a beat event dispatch but {nameof(isBeatEventReady)} was false. Must check first."); } //Remove and delete beatEvent = EventQueue.FindMin(); EventQueue.DeleteMin(); } if (beatEvent == null) { throw new InvalidOperationException($"Failed to read beat event from the Beat {nameof(EventQueue)}."); } //Just dispatch the beat event beatEvent.Dispatch(); }