Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#TCP客户端提供ObjectDisposedException_C#_Sockets - Fatal编程技术网

C#TCP客户端提供ObjectDisposedException

C#TCP客户端提供ObjectDisposedException,c#,sockets,C#,Sockets,我有一个非常基本的socket聊天室(服务器/客户端)。我在服务器中遇到ObjectDisposedException错误。每次客户端连接时,它都会创建一个新线程来处理该客户端(是的,我知道这可能会对大量客户端造成问题,但我最多只能有10个)。然后,该线程将循环,每次循环时,它将读取连接到客户端的网络流,将其回显到客户端,然后循环。代码如下: while (true) { buffer = new byte[client.ReceiveBufferSize]; //Read i

我有一个非常基本的socket聊天室(服务器/客户端)。我在服务器中遇到ObjectDisposedException错误。每次客户端连接时,它都会创建一个新线程来处理该客户端(是的,我知道这可能会对大量客户端造成问题,但我最多只能有10个)。然后,该线程将循环,每次循环时,它将读取连接到客户端的网络流,将其回显到客户端,然后循环。代码如下:

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();