Как избежать 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