Problemas para resolver "No se puede acceder al objeto dispuesto". Excepción

En mi proyecto actual hay una clase de formulario que se ve así:

public partial class FormMain : Form
{

    System.Timers.Timer timer;
    Point previousLocation;
    double distance;

    public FormMain()
    {
        InitializeComponent();

        distance = 0;
        timer = new System.Timers.Timer(50);
        timer.AutoReset = true;
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.Start();
    }

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (previousLocation != null)
        {
            // some code

            UpdateDistanceLabel(distance);
            UpdateSpeedLabel(v);
        }

        previousLocation = Cursor.Position;
    }

    private void UpdateDistanceLabel(double newDistance)
    {
        if (!lblDistance.IsDisposed && !IsDisposed)
        {
            Invoke(new Action(() => lblDistance.Text = String.Format("Distance: {0} pixels", newDistance)));
        }
    }

    private void UpdateSpeedLabel(double newSpeed)
    {
        if (!lblSpeed.IsDisposed && !IsDisposed)
        {
            Invoke(new Action(() => lblSpeed.Text = String.Format("Speed: {0} pixels per second", newSpeed)));
        }
    }

}

Como puede ver, estoy usando un objeto System.Timers.Timer. Sé que podría usar System.Windows.Forms.Timer, pero estoy bastante interesado en la razón por la que sigo recibiendo la excepción que se muestra en el título. Se lanza a la llamada Invoke en el método UpdateDistanceLabel. Lo que me confunde es que dice "No se puede acceder al objeto dispuesto: FormMain" a pesar de que estoy comprobando si está dispuesto o no. Entonces eso no debería suceder. También he intentado eliminar el objeto del temporizador en el evento FormClosing, así como anular Dispose (bool) y eliminarlo allí, lo que desafortunadamente no ayudó en absoluto. Además, la excepción no siempre se produce, supuestamente solo cuando el temporizador se activa mientras el programa está saliendo. Todavía sucede mucho.

He visto que hay toneladas de hilos sobre esto, pero ya he probado las soluciones publicadas allí, la mayoría de ellas implican verificar la propiedad IsDisposed, que no funciona para mí. Así que supongo que estoy haciendo algo mal.

Así que mi pregunta: ¿por qué el código publicado anteriormente activa una excepción a pesar de que estoy verificando si los objetos a los que estoy accediendo están dispuestos o n

Respuestas a la pregunta(8)

Su respuesta a la pregunta