检查IsDisposed和Disposing时“无法访问已处置的对象”

时间:2012-10-31 15:13:12

标签: c# winforms objectdisposedexception

当应用程序收到来自服务的呼叫时,它会为每个呼叫打开一个表单。用户必须在每个窗口中输入并关闭它。为了平滑用户的工作,我正在尝试重新激活用户在显示下一个窗口时正在处理的窗口。

执行此操作的方法如下:

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)

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:4)

尝试反转 if 条件:

这一行

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

必须成为

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

这是因为条件按照它们的写入顺序进行检查,因此您的代码可能会调用Disposing对象,这会导致错误。

编辑:

我还认为您应该将 || 更改为&& ,因为如果您的窗口没有处置但处于处置状态,则可能有一个错误。

答案 1 :(得分:1)

您无法访问已处置的对象。为什么要处理?当用户关闭表单时,关闭的默认行为是处理它。为了防止这种情况,你必须覆盖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.
}

问候。