Решение проблем «Нет доступа к удаленному объекту». Исключение

В моем текущем проекте есть класс Form, который выглядит так:

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)));
        }
    }

}

Как видите, я использую объект System.Timers.Timer. Я знаю, что могу использовать System.Windows.Forms.Timer, но мне довольно интересно, почему я все еще получаю исключение, показанное в заголовке. Он вызывается при вызове Invoke в методе UpdateDistanceLabel. Что меня смущает, так это то, что он говорит: «Не удается получить доступ к удаленному объекту: FormMain», хотя я проверяю, удален ли он или нет. Так что этого не должно случиться. Я также попытался удалить объект таймера в событии FormClosing, а также переопределить Dispose (bool) и удалить его там, что, к сожалению, не помогло вообще. Кроме того, исключение не всегда генерируется, предположительно, только когда срабатывает таймер во время выхода из программы. Это все еще случается много.

Я видел, что по этому поводу существует множество тем, но я уже попробовал опубликованные там решения, большинство из которых включают проверку свойства IsDisposed, что не работает для меня. Итак, я думаю, что я делаю что-то не так.

Итак, мой вопрос: почему код, размещенный выше, вызывает исключение, даже если я проверяю, удаляются ли объекты, к которым я обращаюсь, или нет?

Ответы на вопрос(4)

Ваш ответ на вопрос