【问题标题】:Cannot access a disposed object. Object name: System.net.Sockets.Socket无法访问已处置的对象。对象名称:System.net.Sockets.Socket
【发布时间】:2018-08-28 01:09:45
【问题描述】:

我很难将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);
     }
}

【问题讨论】:

  • 你为什么在Send_Click()中使用嵌套块?
  • __ClientSockets 变量是什么?
  • 那么,为什么你说“这是我的代码在服务器中”?
  • 什么包含txt_Text 和什么rich_Text? (我猜第一个是System.Windows.Forms.TextBox,第二个是System.Text.StringBuilder,是吗?)
  • 因为您正在遍历套接字并将消息发送给所有套接字?这并不(根据您提供的代码)似乎取决于您的复选框的状态。

标签: c#


【解决方案1】:

在您做任何事情之前,请阅读how to debug a small program 上的这篇文章。这一次以及未来的每一次都会有所帮助。

由于我们没有minimal, complete and verifiable example,我将做一些假设。

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

无论哪种方式,你都会通过调试一个小程序找到你的问题。

【讨论】:

  • 先生您在吗?你能帮我解决这个问题吗?
  • @JohnDenver 这似乎是一个全新的问题。你应该为它创建一个新问题,这会让你得到更多的关注。您是否阅读了我链接的两篇文章?他们应该帮助您编写代码并提出正确的问题以获得快速答案。我不知道您的新示例中的哪一行失败了,但是当您收到“服务器:-O”时,看起来您确实关闭了套接字。关闭它后,您将无法再次调用 BeginReceive。那将失败。
  • 问另一个问题需要一周时间。当我尝试打开另一个表单时它失败了,我需要关闭套接字,这样客户端套接字就不会在 Checklistbox 中加倍。当另一个表单打开时,它会再次连接到服务器。服务器可以将其远程返回到登录表单。每次关闭表单和套接字时都会出错。对不起我的英语。
  • @JohnDenver 你的英语很好。这是一个新问题,需要一个新的、最小的、完整的和可验证的例子。请阅读我在回答中链接的两个页面,然后提出一个新问题。
  • 已经读过了。我的代码没有错误。它可以顺利运行,但每次我打开和关闭表单时都会出现。我想摆脱它。该程序可以与它一起运行,但它很烦人。因为当我尝试打开客户端时,它会弹出。当客户的时间完成时。表单将关闭,登录将出现另一个无法访问已处置对象的弹出窗口。对象名称:System.net.Sockets.Socket
猜你喜欢
  • 2022-01-11
  • 2020-04-23
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
相关资源
最近更新 更多