C# 何时需要处置(服务器客户端)对象?

C# 何时需要处置(服务器客户端)对象?,c#,stream,client-server,dispose,idisposable,C#,Stream,Client Server,Dispose,Idisposable,在服务器中-多客户端应用程序[TCP]。我为服务器中接受的每个客户端使用Socket、NetworkStream、StreamReader和StreamWriter。。所以我有几个问题: 当我想关闭与客户端的连接时,是否必须处理所有这些文件? 如果客户端处理与服务器连接的套接字。。我是否也要在服务器端处理该套接字,或者它会自动关闭? 在我的代码中: Thread thAccept = new Thread(acceptClient); Thread thJob; private void

在服务器中-多客户端应用程序[TCP]。我为服务器中接受的每个客户端使用Socket、NetworkStream、StreamReader和StreamWriter。。所以我有几个问题: 当我想关闭与客户端的连接时,是否必须处理所有这些文件? 如果客户端处理与服务器连接的套接字。。我是否也要在服务器端处理该套接字,或者它会自动关闭? 在我的代码中:

 Thread thAccept = new Thread(acceptClient);
 Thread thJob;
 private void acceptClient()
    {
        while (true)
        {
            Socket client = server.Accept();
            Console.WriteLine(client.RemoteEndPoint+" has connected");
            StreamReader reader = new StreamReader(new NetworkStream(client));
            //is it ok to create an instance NetworkStream like this or i will have to dispose it later?

            thJob = new Thread(Job);
            thJob.Start(reader);
        }
    }

 private void Job(object o)
    {
        StreamReader reader = (Socket)o;
        try
        {
            string cmd = null;
            while ((cmd = reader.ReadLine()) != null)
            {
              //(BLA BLA..)
            }
        }
        catch
        {
            Console.WriteLine("Disconnected by catch");  
        }
        finally
        { 
            Console.WriteLine("Finally Done.");
            reader.Dispose();
        }
    }

该代码可以处理所有需要处理的对象吗?

这不是重复代码

您的代码与链接副本不同,因为在您的代码中,IDisposable被传递给另一个线程

一般的规则是,如果您创建了一个实现IDisposable的对象,那么您需要负责在完成该对象后对其调用Dispose。如果可能,应该在using块中完成,以确保始终调用Dispose。在您的情况下,直到退出另一个线程,您的代码才完成对象。在该线程中,在finally块中正确调用Dispose

如果您在NetworkStream上调用了Dispose,那么它也会关闭StreamReader,这会破坏您的目的。我怀疑如果你在插座上调用Dispose,情况也会一样。因此,您的代码是正确的

客户端上的对象与服务器端上的对象没有关系,除非通过TCP/IP。客户端可以在其套接字上调用Dispose,这并不意味着服务器必须在其套接字上调用Dispose。但是,一旦服务器完成从套接字读取数据并关闭连接,就应该释放服务器端套接字。我不确定,但我相信当StreamReader被释放时,底层的NetworkStream将被释放,它应该在创建流的套接字上调用Dispose

您的代码很好,除了一些不相关的问题:您不需要将cmd设置为null,因为您将在下一个语句中设置值。另外,您不应该使用这样的空catch块。您不知道抛出了什么异常,但无论如何都会忽略它,甚至不会记录或显示异常。至少,你应该这样做

    catch (Exception ex)
    {

        Console.WriteLine("Disconnected by exception " + ex.ToString());   
    } 
    finally 
    {  
        Console.WriteLine("Finally Done."); 
        reader.Dispose(); 
    } 

可能重复的请在发布问题之前进行一点搜索。这个问题已经被问了十几遍了。@JohnSaunders好吧,我还是c.的初学者。。我无法理解你链接的所有答案。。但我认为它不能回答我的问题。。这是一个不同的问题。。我希望你读到最后。。你只要读一下主题就行了!有些次级问题对我很重要。。如果你不想帮忙,请。。让别人来帮助我,不要结束我的问题。好吧,你几乎是对的。我读了你问题的标题和正文。我没有读代码。这不是重复的。谢谢你的回答。。。我发布的代码是草稿。。我把它放在那里是为了知道连接因为客户端而关闭。以后就不需要了,因为它是一个静默服务器。。用户不应该通知任何东西。