I wrote a sample app for a customer and this the part with black magic 😄
        void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
        {
            if (oldScale != m_mapControl.MapScale)
            {
                // Fill with cached map scales
                double[] cachedScales = new double[] { 1500, 15000, 55000, 125000, 350000, 750000, 1500000, 3500000, 13000000, 60000000 };
                double newScale = cachedScales[cachedScales.Length-1];
                // Scale changed!
                // Scale to the closest scale level of cached map service
                for (int i = 1; i<cachedScales.Length; i++) {
                    if (cachedScales >= m_mapControl.MapScale)
                    {
                        if (Math.Abs(cachedScales[i - 1] - m_mapControl.MapScale) <= Math.Abs(cachedScales - m_mapControl.MapScale))
                        {
                            newScale = cachedScales[i - 1];
                        }
                        else {
                            newScale = cachedScales;
                        }
                        break;
                    }
                }
                oldScale = newScale;
                m_mapControl.MapScale = newScale;
                m_mapControl.ActiveView.Refresh();
                oldScale = m_mapControl.MapScale;
                
            }
        }