【问题标题】:An unhandled exception of type 'System.ObjectDisposedException' occurred in System.dllSystem.dll 中出现“System.ObjectDisposedException”类型的未处理异常
【发布时间】:2014-08-20 07:25:05
【问题描述】:

在我的项目中,当我通过调试运行它时,经过一段时间后,它突然崩溃了。它没有发生在任何特殊时间或特定时期之后。它自己崩溃了,我不知道为什么?!

我收到了这条消息:

An unhandled exception of type 'System.ObjectDisposedException' occurred in System.dll
Additional information: Cannot access a disposed object.

以及它的图片,了解更多信息......

我正在使用 vs 2013 和 C# win form...

这是我的简单代码:

private void btnConnect_Click(object sender, EventArgs e)
    {
        Result = socketComponent.tcpConnect(Host, int.Parse(Port));
        if (Result == 0)
            MessageBox.Show("Connected"); 
    }

private void btnDisconnect_Click(object sender, EventArgs e)
{
    if (socketComponent != null)
    {
        socketComponent.tcpDisconnect();

        socketComponent.Dispose();
        MessageBox.Show("DisConnected"); 
    }

}

点击On btnDisconnect后突然发生。也许在第二次点击或更多...

【问题讨论】:

  • 没有异常 StackTrace 可用吗?应该让您轻松追踪问题...
  • @WolfgangZiegler 我更改了图片。它显示 StackTrace。也许它发生在缓冲区的 bcz 中。是否可以?如何处理我的缓冲区异常...?
  • 简单!我认为 btnConnect_Click 事件处理程序中也应该有一个空检查,或者可能是重新创建/重新连接 socketComponent 的逻辑。

标签: c# winforms


【解决方案1】:

我的猜测是,您应该像这样更改代码:

private void btnDisconnect_Click(object sender, EventArgs e)
{
    if (socketComponent != null)
    {
        socketComponent.tcpDisconnect();

        socketComponent.Dispose();

        // set to null!
        socketComponent = null;
        //

        MessageBox.Show("DisConnected"); 
    }
}

否则,第二次单击“btnDisconnect”将再次调用Dispose,这通常不允许在已处置的对象上进行。因此,例外。

【讨论】:

  • 我测试了你的代码,但没有解决我的问题。它仍然显示该异常
  • 如果调用connect,仍然可能会发生异常。您还必须在连接单击中检查 socketComponent 是否为空。或者每次调用 connect 时都重新创建对象。
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多