Не удается получить доступ к удаленному объекту при проверке IsDisposed и Disposing

Когда приложение получает вызов от службы, оно открывает форму для каждого звонка. Пользователь должен вводить данные в каждое окно и закрывать его. Чтобы сгладить работу пользователя, я пытаюсь повторно активировать окно, над которым работал пользователь, когда отображается следующее.

Способ сделать это ниже:

private void ActivatePreviousActiveForm() {

    if (_activeWhenOpen != null && _activeWhenOpen.InvokeRequired) {
         if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)
              _activeWhenOpen.Invoke((MethodInvoker)ActivatePreviousActiveForm);
    } else
         if (_activeWhenOpen != null && !(_activeWhenOpen is FrmRuntimeError))
             _activeWhenOpen.Activate();
}

Иногда он выдает «Невозможно получить доступ к удаленному объекту» при достижении строки

if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)

Кто-нибудь знает, почему это произойдет?


person CristisS    schedule 31.10.2012    source источник
comment
Быстрая догадка будет заключаться в том, что вы должны попытаться изменить условие. Возможно, что если объект полностью удален, удаление приведет к ошибке.   -  person LightStriker    schedule 31.10.2012
comment
Вероятно, потому, что сборщик мусора CLR уже очистил удаленный объект, поэтому он больше не существует.   -  person Liam    schedule 31.10.2012
comment
@Liam: удаление объекта не приводит к его сбору GC, поскольку на него все еще ссылается метод.   -  person LightStriker    schedule 31.10.2012


Ответы (2)


Попробуйте инвертировать условие if:

Эта линия

if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)

должен стать

if (!_activeWhenOpen.IsDisposed || !_activeWhenOpen.Disposing)

Это связано с тем, что условия проверяются в том порядке, в котором они написаны, поэтому ваш код может вызвать Disposing для объекта, который уже удален, что вызовет вашу ошибку.

РЕДАКТИРОВАТЬ:

Я также думаю, что вы должны изменить || на && , потому что, если ваше окно не находится в состоянии Disposed, но находится в состоянии Disposed, у вас может возникнуть ошибка.

person il_guru    schedule 31.10.2012
comment
Думаю, мне следовало создать ответ, а не помещать его в комментарий. :D - person LightStriker; 31.10.2012
comment
упс! Я не увидел комментарий, когда нажал на кнопку ответа! Прости! - person il_guru; 31.10.2012
comment
@il_gury: не извиняйся, я просто не был полностью уверен - person LightStriker; 31.10.2012
comment
@il_guru имеет смысл ... должен был это видеть. Спасибо! - person CristisS; 31.10.2012

Вы не можете получить доступ к удаленному объекту. Почему он утилизирован? Когда пользователь закрывает форму, поведение закрытия по умолчанию заключается в ее удалении. Чтобы предотвратить это, вам придется переопределить метод Close, чтобы он просто скрывал форму, а не удалял ее. Нравится:

// Use this event handler for the FormClosing event.
private void YourFormClosing(object sender, FormClosingEventArgs e)
{
  this.Hide();
  e.Cancel = true; // this will cancel the close event.
}

С Уважением.

person digaomatias    schedule 31.10.2012
comment
Форма не удаляется автоматически, если она отображается с помощью метода ShowDialog, только если она отображается с помощью метода Show. - person Chris Dunaway; 31.10.2012