c# - 检查 IsDisposed 和 Disposing 时为 "Cannot access a disposed object"

标签 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)

有人知道为什么会这样吗?

最佳答案

尝试反转if条件:

这一行

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

必须成为

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

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

编辑:

我还认为你应该将 || 更改为 && ,因为如果你的窗口不是 Disposed 但处于 Disposing 状态,你可能会出错。

关于c# - 检查 IsDisposed 和 Disposing 时为 "Cannot access a disposed object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13161115/

相关文章:

c# - 休眠Linq

c# - 无法确定应用程序关闭期间 System.ObjectDisposeException 的原因

c# - VSTEST@2 - 错误找不到测试主机 | Azure管道

c# - 如何更改复选框上的支票图像

c# - 仅更改月份和年份的 DateTimePicker

winforms - 如何更改 Visual Studio IDE 中表单控件的默认字体

c# - 什么可能导致 WCF 中出现 "Cannot access a disposed object"错误?

c# - TcpClient 过早处置

c# - 我可以将 SqlDependency 与多个监听器/负载平衡一起使用吗

c# - 如何从Excel表格上传考勤表到考勤表?