无法访问已处置的对象。对象名称:System.net.Sockets.Socket

时间:2018-08-15 18:37:17

标签: c#

我很难把BeginReceive.放在哪里,对此我是陌生的。有人可以帮我弄这个吗。每次我致电_clientSocket.Close();时,都会收到一条错误消息。

  

无法访问已处置的对象。对象名称:   System.net.Sockets.Socket

您的建议将不胜感激。如果我错了请纠正我,谢谢!

我编辑了整个问题,因为我无法再问,我需要改进如何提出问题。抱歉,我是此页面的新手。

private void ReceiveData(IAsyncResult ar)
{
     try
     {
         int received = _clientSocket.EndReceive(ar);
         if (received == 0)
         {
             return;
         }

         Array.Resize(ref receivedBuf, received);
         string text = Encoding.Default.GetString(receivedBuf);

         if (text == "Server: -O")
         {
             Thread NT = new Thread(() =>
             {
                 this.BeginInvoke((Action)delegate ()
                 {
                   textBox1.Text = "Guest";
                   this.Hide();
                   _clientSocket.Close();
                   Usertimer us = new Usertimer(textBox1.Text);
                   us.Show();
                 });
             });
             NT.Start();

         }

         Array.Resize(ref receivedBuf, _clientSocket.ReceiveBufferSize);
         AppendtoTextBox(text);
         _clientSocket.BeginReceive(receivedBuf, 0, receivedBuf.Length, SocketFlags.None, new AsyncCallback(ReceiveData), null);
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
}

1 个答案:

答案 0 :(得分:0)

执行任何操作之前,请先阅读how to debug a small program上的这篇文章。它将在这个时候以及将来的每一次都提供帮助。

由于我们没有minimal, complete and verifiable example,因此我要作一些假设。

似乎您每次单击都不断将其添加到__ClientSockets列表中。由于没有代码可从__ClientSockets中删除,因此,即使您未从复选框中选择它们,随后对Sendata的每次单击和调用也只会添加到更多ip。根据您希望程序如何工作,可以添加从__ClientSockets中删除客户端的代码,也可以在每次单击按钮时完全清除列表。由你决定。

无论哪种方式,您都可以通过调试一个小程序来找到问题。