[英]When do i need to dispose a (server-client) objects?
在服务器-(多)客户端应用程序[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
在其上调用Dispose
。 如果可能,应在using
块中完成此using
,以确保始终调用Dispose
。 就您而言,在退出另一个线程之前,代码不会以对象完成 。 在该线程中,您可以在finally
块中正确调用Dispose
。
如果您在NetworkStream
上调用了Dispose
,那么它也将关闭StreamReader
,这将使您无法达到目的。 我怀疑如果您在Socket
上调用Dispose
也是一样。 因此,您的代码是正确的。
客户端上的对象与服务器端上的对象没有关系,除非通过TCP / IP。 客户端可以在其套接字上调用Dispose
的事实并不意味着服务器必须在其套接字上调用Dispose
。 但是,一旦服务器完成了从套接字读取数据并关闭了连接,则服务器端套接字应该被Disposed
。 我不确定,但是我相信当StreamReader
被StreamReader
时,底层的NetworkStream
将被释放,它应该在创建流的套接字上调用Dispose
。
您的代码很好,除了一些无关的问题:您无需将cmd
设置为null
,因为您将在下一条语句中设置值。 另外,您不应使用空的catch
块。 您不知道引发了什么异常,但是无论如何您都将忽略它,甚至不会记录或显示该异常。 至少你应该做
catch (Exception ex)
{
Console.WriteLine("Disconnected by exception " + ex.ToString());
}
finally
{
Console.WriteLine("Finally Done.");
reader.Dispose();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.