我对C#有相当的经验,但我之前从未遇到过这个问题,我想知道是否有更多有经验的C#开发人员知道在这种情况下该怎么做。这是相关方法的代码:(问题在代码块之后解释)
public void ConnectToRemoteServer()
{
Console.WriteLine("Attempting to connect to " + config.GetString(ConfigParams.MasterServerIp) + ":" + config.GetString(ConfigParams.MasterServerPort));
TcpClient client = new TcpClient();
IPEndPoint address = new IPEndPoint(IPAddress.Parse(config.GetString(ConfigParams.MasterServerIp)), config.GetInt(ConfigParams.MasterServerPort));
Console.WriteLine("Connecting...");
//Begin asynchronous sever communication
if (this.autoTask == null)
{
communicator = new CommunicationListener(client, config, address);
}
else
{
communicator = new CommunicationListener(client, config, address, this.autoTask);
}
Thread communicationThread = new Thread(new ThreadStart(communicator.Start));
communicationThread.Start();
}
我想知道的部分是我是否应该在这段代码中使用using语句。我知道TcpClient
实现了接口IDisposable
,因此应该封装在using语句中,但是,在这种情况下,会启动一个使用TcpClient
的新线程,并且这样using
块的结尾将在使用TcpClient
之前到达。那么我应该在这里使用using
声明吗?
答案 0 :(得分:2)
不要在这里使用,因为它会使你的程序因早期处理而无法正常工作。只需确保将TcpClient
正确地移交给新线程,并确保线程最终处理它。
我认为最好在子线程中创建TcpClient
,以便在那里使用using
。
答案 1 :(得分:2)
我认为在这种情况下避免使用块是正确的,因为在using块的末尾使用了隐式close()。我认为这是一个相当常见的恶化来源,因为关于何时使用块的通常建议是“每当对象暗示IDisposable”时。
这是一篇关于何时不使用的权威文章,无论IDisposable的实现如何。 http://msdn.microsoft.com/en-us/library/aa355056.aspx
答案 2 :(得分:1)
一般的经验法则是,如果它的IDisposable,那么你应该处置该对象。
使用块为您提供了一种简单易行的方法,但由于您的TCPClient将在此方法之外保留,因此在这种情况下无法使用。
如果你真的想编写好的代码,那么应该在你的类中声明你的TCPClient,让你的类实现IDisposable,在新的Dispose方法中处理你的TCPClient。 (和 也许做一些关于结束你的线程的事情。)
这样你就可以在使用块中包装你的类了。
答案 3 :(得分:0)
我认为存在一种不同的问题。 您必须在CommunicationListener中实现IDisposable并在那里实例化TcpClient并将TcpClient置于CommunicationListener.Dispose实现中。
何时处理CommunicationListener会更好? 这取决于。
答案 4 :(得分:0)
我会使这个方法存在的类和CommunicationListener都是一次性的。然后我将通过在其上设置一个标志来实现一种取消通信监听器线程的方法,这样当你自己的类被释放时,它就不会让另一个线程继续运行。然后在父类的Dispose中设置标志,以便CommunicationListener可以停止,处理CommunicationListener,然后在内部使用TcpClient。
我希望这是有道理的。