Как избежать ObjectDisposedException при закрытии приложения

У меня возникла проблема, повторяющаяся во всем приложении, но я думаю, что этим можно управлять одинаково.

У меня есть класс IDisposable в моем приложении Winforms (это пользовательский элемент управления, производный от System.Windows.Forms.Label)

В этом классе у меня есть таймер, чье событие тик это:

    private void TickTimer(object state)
    {
        Action updateText = () =>
        {
            this.Parent.SuspendLayout();
            this.Text = DateTime.Now.ToString("HH:mm:ss");
            this.Parent.ResumeLayout(false);
        };

        if (this.InvokeRequired)
            this.Invoke(updateText);
        else
            updateText();
    }

С другой стороны, это метод Dispose:

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            Stop();
            _timer.Dispose();
        }
        base.Dispose(disposing);
    }

Проблема заключается в том, что при закрытии приложения в вызове this.Invoke(updateText) выдается исключение, сообщающее, что основная форма (в которой находится элемент управления) была удалена.

Поскольку это происходит асинхронно, как я могу управлять этим?

Я думал о размещении поля класса с именем, например, _isDisposed и в каждой строке TickTimer, чтобы проверить, было ли оно удалено, но это действительно ужасно.

Поиск здесь в Stackru, я нашел несколько советов.... ни один не работал. Последняя попытка состояла в использовании флага "обновление".

    private void TickTimer(object state)
    {
        _updating = true;

        Action updateText = () =>
        {
            this.Parent.SuspendLayout();
            this.Text = DateTime.Now.ToString("HH:mm:ss");
            this.Parent.ResumeLayout(false);

            _updating = false;
        };

        if (this.InvokeRequired)
            this.Invoke(updateText);
        else
            updateText();
    }

и в методе утилизации:

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            Stop();
            _timer.Dispose();

            while (_updating) ;
        }
        base.Dispose(disposing);
    }

Но такая же ошибка происходит. Кажется, что родительская форма располагается раньше, чем дочерний элемент управления.

Каков наилучший способ сделать это?

Jaime

0 ответов

Другие вопросы по тегам