所以我只是在学习C#中的Threads并且出现了一个问题。
我有一个TCP-Server-Class,它接受连接并将它们传递给TCP-Client-Class
代码大致如下:
(虚拟代码)
Class TcpServer
{
public static Main(string[] args)
{
while(true)
{
//I create a new instance of my "TCP-Client-Class" and pass the accepted connection to the konstruktor
ConnectionHandler client = new ConnectionHandler(TCPListner.acceptconnections);
//create a new Thread to handle that connection
Thread client1 = new Thread (client.handleConnection()); //and start handling it
client.start;
//Do some other stuff for protokolling
do.someOtherStuff;
// and then wait for a new connection
}
}
//Some other Methods ect.
}
Class ConnectionHandler
{
//Konstruktor in wich a connection TCPclient connection has to be passed
public ConnectionHandler(TCPclient client)
{
//Do stuff
}
//Method to handle connection
public void handleConnections()
{
//Open streams
//.
//.
//.
//close streams
//close connections
}
}
现在我的问题:
a)在达到"关闭连接后,是否有必要再次关闭该线程。一部分?
b)要关闭一个线程,我只需要在我的主类中调用.join方法,或者还有什么我需要注意的。
c)如果出现错误,我可以简单地离开" handleConnection()"方法并关闭该线程(ofc具有适当的错误处理)?
d)放弃"客户"是否重要?引用或" client1"参考?或者它只是被垃圾收集器消耗了?
答案 0 :(得分:4)
嗯,让线程正常完成是完全没问题的。如果线程的顶级调用抛出异常,则可能会取消该过程,具体取决于CLR的配置方式。拥有一个顶级错误处理程序来记录错误并继续前进通常会更好。
但是,你应该考虑在关机时想要发生什么:
while (true)
循环以允许某种关闭机制Join
对它们(可能是超时)允许它们完成之前服务器完成。但是,您希望在完成时从该集合中删除该线程。这种事情很快就会变得非常繁琐,但绝对可行。顺便说一下,使用线程池来处理这类事情比较常见,而不是为每个请求创建一个全新的线程。