【问题标题】:Threading in C#: .join obligotory?C# 中的线程:.join 是强制性的吗?
【发布时间】:2016-05-15 02:10:27
【问题描述】:

我刚刚学习 C# 中的线程,出现了一个问题。

我有一个 TCP-Server-Class,它接受连接并将它们传递给 TCP-Client-Class。
代码大致如下:(dummy code)

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 constructor
          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 etc.
}

Class ConnectionHandler
{
   //Constructor in which 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) 删除“client”引用或“client1”引用是否重要?还是只是被垃圾收集器消耗掉了?

【问题讨论】:

  • 也许出于教育目的,直接使用 Thread 类很有趣,但出于其他目的,我建议您查看线程池甚至 C#6 中的异步功能
  • @Rafa 好吧,那是我第二次阅读线程池,我现在肯定会阅读它:D

标签: c# multithreading sockets tcpclient tcplistener


【解决方案1】:

好吧,让线程正常完成是完全可以的。如果线程的顶级调用抛出异常,它可能会取消进程,具体取决于 CLR 的配置方式。通常最好有一个顶级错误处理程序来记录错误并继续。

但是,您应该考虑您希望在关机时发生什么:

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

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

【讨论】:

  • 什么是 CLR :D 线程池是指线程数组,对吗? (这就是我在“正确”代码中所做的,并且有一种机制可以停止接受连接。这仍然只是一个虚拟代码,可以帮助我使我的代码更明显:)) PS:感谢您的回答
  • 所以...总之你说的是,当线程到达“它的代码末尾”时,它会自行终止,而不必用.join 关闭它。对吗?
  • @MilesA.:要理解“CLR”和“线程池”这两个术语,我建议您进行常规研究——阅读书籍、进行网络搜索等。但是,是的,没有必要加入线程...没有“关闭”它的概念。
  • 已经在这样做了 :D 谢谢你的帮助 :)
  • @JonSkeet 确保应用程序关闭时线程终止的最佳方法不是设置thread.IsBackground = true吗?
猜你喜欢
  • 1970-01-01
  • 2020-07-05
  • 2012-04-09
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2016-11-22
  • 2019-04-04
  • 1970-01-01
相关资源
最近更新 更多