【问题标题】:ObjectDisposedException while using socket使用套接字时出现 ObjectDisposedException
【发布时间】:2015-01-30 16:13:50
【问题描述】:

我的类库用于通过套接字获取和发送文本消息时遇到了很大的问题。这是我的简单代码:

private void AcceptNewSocket()
{
    Socket socket = list.AcceptSocket();
    socket.ReceiveBufferSize = 1001;
    Thread socketTh = new Thread(new ThreadStart(AcceptNewSocket));
    socketTh.Start();
    WaitForMessenge(socket);
}

private void WaitForMessenge(Socket socket)
{
    byte[] buff = new byte[1001];
    int bufcount = socket.Receive(buff);
    /////////some operations on byte array
    while(bufcount > 0)
    {
      buffcount = socket.Receive(buff); //HERE it throws ObjectDisposedException and source is socket
      /////some operations on byte array
    }
 }

当我在控制台应用程序中使用我的库时,没有任何异常。当我在 Windows 窗体应用程序中使用它时会发生这种情况。你能帮帮我吗?

【问题讨论】:

  • 放弃并使用像 Lindgren 这样的东西来建立您的网络。使用原始套接字绝非易事。
  • 如果套接字在其他任何地方关闭,调用 Receive 方法会给你这个异常。确保在使用之前检查对象是否已被处置。
  • 我不会关闭它。它在控制台应用程序之间的通信中运行得很好。
  • @LexLi - 遗憾的是,没有要检查的 socket.IsDisposed 属性,因为 IDisposable 接口没有声明它。我总是将public bool IsDisposed { get; private set; } 添加到我的一次性课程中,然后开始protected virtual void Dispose(bool) { if (IsDisposed) return; IsDisposed = true; ... }

标签: c# sockets objectdisposedexception


【解决方案1】:

AcceptNewSocket() 在我看来真的很可疑。我强烈建议对其进行审查。

list.AcceptSocket() 有什么作用?这可能是处理套接字的可能位置。

为什么要递归创建线程?这可能会产生数十个线程,因此它们会在处理套接字时抛出异常。

嗯...除此之外,我会使用 ThreadPool 类而不是 Threads 以获得更好的性能。

【讨论】:

  • 对不起。 “列表”是我的 tcplistener 对象。当我不创建新线程时,也会发生此异常。
  • @Wynglarz - Alex 关于 为什么要递归创建线程? 的观点不是你不应该创建线程,而是你不应该创建线程 inside AcceptNewSocket() 的工作方法与AcceptNewSocket() 完全相同。这会导致无限递归,并且第一次调用 AcceptNewSocket() 将消耗资源,直到您的应用程序终止。
猜你喜欢
  • 1970-01-01
  • 2018-07-09
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多