C#TCP客户端提供ObjectDisposedException
我有一个非常基本的socket聊天室(服务器/客户端)。我在服务器中遇到ObjectDisposedException错误。每次客户端连接时,它都会创建一个新线程来处理该客户端(是的,我知道这可能会对大量客户端造成问题,但我最多只能有10个)。然后,该线程将循环,每次循环时,它将读取连接到客户端的网络流,将其回显到客户端,然后循环。代码如下:C#TCP客户端提供ObjectDisposedException,c#,sockets,C#,Sockets,我有一个非常基本的socket聊天室(服务器/客户端)。我在服务器中遇到ObjectDisposedException错误。每次客户端连接时,它都会创建一个新线程来处理该客户端(是的,我知道这可能会对大量客户端造成问题,但我最多只能有10个)。然后,该线程将循环,每次循环时,它将读取连接到客户端的网络流,将其回显到客户端,然后循环。代码如下: while (true) { buffer = new byte[client.ReceiveBufferSize]; //Read i
while (true)
{
buffer = new byte[client.ReceiveBufferSize];
//Read incoming data
int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
if (dataReceived == "CONSOLE::close") //if client tells server it is closing, remove client from clients list
{
clients.Remove(client);
client.Close();
break;
}
else //send data to all clients
{
byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(dataReceived);
foreach (TcpClient b in clients)
{
NetworkStream x = b.GetStream();
x.Write(bytesToSend, 0, bytesToSend.Length);
}
}
}
其中client是当前客户端连接,clients是所有当前连接的客户端的列表
我在while循环buffer=newbyte[client.ReceiveBufferSize]的第一行中得到了错误代码>有关错误的更多详细信息:
An unhandled exception of type 'System.ObjectDisposedException' occurred in System.dll
Additional information: Cannot access a disposed object.
但我还没有处理好这个东西?还要注意,我正在使用多个线程,因此不确定这是否会影响它。有人能让我更好地理解为什么会发生这种错误吗?谢谢
编辑:
以下是while循环之前的代码片段(相同的方法):
单击按钮时调用该方法
localIP = IPAddress.Parse(SERVER_IP);
listener = new TcpListener(localIP, PORT);
listener.Start();
//Create new thread on which the server listens for clients
Thread t = new Thread(new ThreadStart(ClientListener));
t.IsBackground = true;
t.Start();
解决方案:
我很愚蠢,没有意识到在本地方法之外初始化客户机
会使所有线程都可以访问它。因此,当一个线程关闭客户端时,它会关闭所有线程。感谢Karolis。请提供一个而不仅仅是部分代码。@JonSkeet我不确定在这种情况下还有什么其他帮助,因为与客户端/服务器端通信无关。好的,首先是调用代码。。。从根本上说,如果你不给我们足够的信息来复制它,我们将无法帮助你。请阅读并记住,你越快接受如何改进你的问题的建议,你就越快得到答案。代码>其他线程尝试访问已释放的客户端。因此,如果跨线程共享同一个客户端,则最有可能出现问题。@LachlanMather我看不到您在何处创建客户端。:)
localIP = IPAddress.Parse(SERVER_IP);
listener = new TcpListener(localIP, PORT);
listener.Start();
//Create new thread on which the server listens for clients
Thread t = new Thread(new ThreadStart(ClientListener));
t.IsBackground = true;
t.Start();