在C#中穿线:.join obligotory?

时间:2016-02-05 07:20:58

标签: c# multithreading sockets tcpclient tcplistener

所以我只是在学习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"参考?或者它只是被垃圾收集器消耗了?

1 个答案:

答案 0 :(得分:4)

嗯,让线程正常完成是完全没问题的。如果线程的顶级调用抛出异常,则可能会取消该过程,具体取决于CLR的配置方式。拥有一个顶级错误处理程序来记录错误并继续前进通常会更好。

但是,你应该考虑在关机时想要发生什么:

  • 应更改while (true)循环以允许某种关闭机制
  • 如果您跟踪当前处理现有请求的所有线程,当您知道自己正在尝试关闭时,可以Join对它们(可能是超时)允许它们完成之前服务器完成。但是,您希望在完成时从该集合中删除该线程。这种事情很快就会变得非常繁琐,但绝对可行。

顺便说一下,使用线程池来处理这类事情比较常见,而不是为每个请求创建一个全新的线程。