// Returns true if low, high, or current has changed private Boolean SetValues(Boolean lockAlreadyTaken, Int64? low, Int64? high, Int64? current) { if (!lockAlreadyTaken) m_lock.Enter(true); try { // If any value is null, set it to its current value (assume no change) low = low.GetValueOrDefault(m_low); high = high.GetValueOrDefault(m_high); current = current.GetValueOrDefault(m_current); if (low > high) throw new InvalidOperationException("Low can't be greater than high"); Int64 oldLow = m_low, oldHigh = m_high, oldCurrent = m_current; m_low = low.Value; m_high = high.Value; // Make sure Current stays between Low and High inclusive if (current < m_low) current = m_low; if (current > m_high) current = m_high; m_current = current.Value; return (oldLow != m_low) || (oldHigh != m_high) || (oldCurrent != m_current); } finally { if (!lockAlreadyTaken) m_lock.Leave(); } }