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

Cri*_*isS 1 c# objectdisposedexception winforms

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

执行此操作的方法如下:

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();
}
Run Code Online (Sandbox Code Playgroud)

有时,当到达该行时,它会抛出“无法访问已处置的对象”

if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会发生这种情况?

il_*_*uru 5

尝试反转if条件:

这条线

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

必须成为

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

这是因为条件是按照写入的顺序检查的,因此您的代码可能会调用Disposing已处理的对象,从而引发错误。

编辑:

我还认为你应该改变|| &&,因为如果您的窗口未已处理但处于正在处理状态,则可能会出现错误。

  • 我想我应该创建答案而不是将其放在评论中。:D (3认同)