0

我正在尝试构建一个多线程服务器,该服务器应该为每个传入的连接生成新线程,但是尽管我付出了所有努力,但它仅在需要时才生成新线程,有人可以帮我调试这段代码吗?我错过了一些明显的东西吗?

 while (true)
 {
   if (txtAddress.Text.Trim() == "Any" || txtAddress.Text.Trim() == "any")
      ipEndP = new IPEndPoint(IPAddress.Any, 778);
   else
      ipEndP = new IPEndPoint(IPAddress.Parse(txtAddress.Text.Trim()), 778);

      tcpL = new TcpListener(ipEndP);
      tcpL.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

      tcpL.Start();
      tempSock = tcpL.AcceptSocket();

 //t = new Thread(ConnectionHandler); //When new client is connected, new thread       //is created to handle the connection
 //t.Priority = ThreadPriority.Highest;
 //t.Start(tempSock);

 ThreadPool.QueueUserWorkItem(ConnectionHandler, tempSock);
 }
4

1 回答 1

4

查看QueueUserWorkItem的 MSDN 文档

排队执行的方法。该方法在线程池线程可用时执行。

将线程放入用户工作项队列并不能保证它会立即开始执行。这实际上是一件好事。如果您的连接如此之多,以至于需要数百或数千个线程,那很容易使您的服务器瘫痪(并且由于过多的上下文切换肯定会非常浪费)。

您注释掉的代码应该为每个连接启动一个新线程。那不工作吗?如果是这样,究竟是什么不起作用?请注意,为每个连接创建一个新线程比使用线程池要昂贵得多。

更新

根据您的评论,注释掉的代码也无法创建太多线程,我会添加......

如果发生这种情况,您正在创建太多线程。

我经常看到人们问为什么他们不能在一个进程中创建超过 2000 个线程。原因不是 Windows 固有的任何特定限制。相反,程序员没有考虑每个线程使用的地址空间量。

线程由内核模式的一些内存(内核堆栈和对象管理)、用户模式的一些内存(线程环境块、线程本地存储等)以及它的堆栈组成。(如果您使用的是 Itanium 系统,则可以使用堆栈。)

通常,限制因素是堆栈大小。

http://blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx

于 2012-08-09T02:24:06.110 回答