Problemas que resolvem “Não é possível acessar o objeto descartado.” Exceção

No meu projeto atual, há uma classe Form que se parece com isso:

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 você pode ver, estou usando um objeto System.Timers.Timer. Sei que poderia usar System.Windows.Forms.Timer, mas estou bastante interessado no motivo pelo qual ainda estou recebendo a exceção mostrada no título. Ele é lançado na chamada Invoke no método UpdateDistanceLabel. O que me confunde é que ele diz "Não é possível acessar o objeto descartado: FormMain", mesmo que eu esteja verificando se está descartado ou não. Então isso não deveria acontecer. Também tentei descartar o objeto timer no evento FormClosing, bem como substituir Dispose (bool) e descartá-lo lá, os quais infelizmente não ajudaram em nada. Além disso, a exceção nem sempre é lançada, supostamente apenas quando o timer é acionado enquanto o programa está saindo. Ainda acontece muito.

Vi que existem toneladas de threads sobre isso, mas já tentei as soluções postadas lá, a maioria delas envolve a verificação da propriedade IsDisposed - o que não funciona para mim. Acho que estou fazendo algo errad

Então, minha pergunta: por que o código postado acima dispara uma exceção, mesmo que eu esteja verificando se os objetos que estou acessando estão descartados ou nã

questionAnswers(8)

yourAnswerToTheQuestion