【问题标题】:When do i need to dispose a (server-client) objects?我什么时候需要处理(服务器-客户端)对象?
【发布时间】:2012-03-21 04:34:48
【问题描述】:

在服务器 -(多)客户端应用程序 [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();
            }
        }
    

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

  • 【问题讨论】:

    • 请在发布问题之前进行一些搜索。这个问题已经被问了十几次了。
    • @JohnSaunders 好吧,我还是 c# 的初学者 .. 我无法理解您链接的所有答案.. 但我认为它不能回答我的问题 .. 它有点不同..我部门你读到了最后..你只是读了这个主题!有一些对我很重要的子问题..如果您不想帮助,请..让其他人帮助我,不要关闭我的问题。
    • 好吧,你几乎是对的。我阅读了标题您问题的文本。我没有阅读代码。这不是重复的。

    标签: c# stream client-server dispose idisposable


    【解决方案1】:

    这不是重复的。

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

    一般规则是,如果您创建一个实现IDisposable 的对象,那么您有责任在完成后调用Dispose。如果可能,应该在 using 块中完成,以确保始终调用 Dispose。在您的情况下,在退出另一个线程之前,您的代码不会与对象完成。在该线程中,您正确地调用了finally 块中的Dispose

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

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

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

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

    【讨论】:

    • 感谢您的回答......我发布的代码是草稿......我只是把它放在那里知道连接由于客户端而关闭。以后不需要它它是一个静默服务器..用户不应该通知任何东西。
    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2011-02-13
    相关资源
    最近更新 更多