首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ThreadPool行为与TCPListener

ThreadPool行为与TCPListener
EN

Stack Overflow用户
提问于 2016-11-01 15:52:02
回答 1查看 717关注 0票数 0

我像这样开始TCPListener,当工作完成后,我关闭了Socket。我想知道我开始的Thread是否是这样的

代码语言:javascript
复制
ThreadPool.QueueUserWorkItem(ConnectClientsThredProc, args);

会自我毁灭所以我不需要任何外部控制。

,谁愿意这么高兴地解释一下,我是否担心过,,谢谢!

代码语言:javascript
复制
   class TCPListenerManager
    {
        TcpListener tcpListener;
        HostListenerItem hostListener;
        private bool _isServerWorking = false;

     public TCPListenerManager(HostListenerItem hostListenerItem)
     {
         hostListener = hostListenerItem;

         tcpListener = new TcpListener(IPAddress.Parse(hostListenerItem.IP4), hostListenerItem.Port);

         var t = Task.Factory.StartNew(async () =>
                {
                    await StartAsync(hostListenerItem.ClientsMax);
                });
            }

    public async Task StartAsync(int clientsMax)
    {
                    tcpListener.Start();
                    _isServerWorking = true;
                    for (int i = 0; i < clientsMax; i++)
                    {
                        if (_isServerWorking)
                        {
                            ServerConnectedEventArgs args = new ServerConnectedEventArgs();
                            args.TcpClient = await tcpListener.AcceptTcpClientAsync();
                            args.HostListener = hostListener;

                            OnServerConnected(args);
                            ThreadPool.QueueUserWorkItem(ConnectClientsThredProc, args);
                        }
   }
}


private void ConnectClientsThredProc(object obj)
{     
           var args = (ServerConnectedEventArgs)obj;

           if (args.TcpClient.Connected)
           {
              // Do some job and disconnect
              args.TcpClient.Client.Close();
              args.TcpClient.Client = null; 
           }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-01 16:05:00

ConnectClientsThredProc退出时,线程不会“消失”,而是返回到池(这就是为什么线程池首先存在)。无论如何,您不应该真的关心这一点,除非您在ConnectClientsThredProc中执行了长期运行的任务。如果运行时间很长,最好不要使用线程池线程,而是启动一个新线程(例如,通过Task.Factory.StartNew + TaskCreationOptions.LongRunning )。

另外,您还使用了Task.Factory、异步等待、ThreadPool.QueueUserWorkItem,所有这些都在一段简短的代码中混合在一起。也许您需要更好地理解这些工具是什么,它们之间有什么相似之处(特别是异步\等待)。例如,造成这种情况的原因是什么:

代码语言:javascript
复制
var t = Task.Factory.StartNew(async () =>
{
      await StartAsync(hostListenerItem.ClientsMax);
 });     

启动一个任务\线程,在其中启动另一个任务,然后等待它退出--没有什么意义。

而不是ThreadPool.QueueUserWorkItem,您可以使用具有相同效果的Task.Run

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40363673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档