我需要调用TcpListener.Stop()吗?

我将此代码放在一个单独的线程(Task)中,该线程在应用程序启动时首先运行,并且在应用程序关闭之前不应该结束:

TcpListener tcpListener = new TcpListener(IPAddress.Any, port); tcpListener.Start(); while (true) { TcpClient client = tcpListener.AcceptTcpClient(); Task.Factory.StartNew(HandleClientCommunication, client); } 

在这种情况下是否需要调用tcpListener.Stop() ? 这个线程在应用程序的整个持续时间内运行,如果我确实需要调用它,我会在哪里这样做? 侦听器是此线程的本地。 我有一个while (appRunning)循环并在FormClosing事件中将appRunning设置为false, while (true)不是有一个while (true)循环吗? 然后在while循环后我可以调用tcpListener.Stop()

但是,甚至需要调用TcpListener.Stop()因为应用程序已经关闭了,因为我正在使用Tasks,所以进程也会结束?

试试这样的事情:

 public class Listener { private readonly TcpListener m_Listener = new TcpListener(IPAddress.Any, IPEndPoint.MinPort); private CancellationTokenSource m_Cts; private Thread m_Thread; private readonly object m_SyncObject = new object(); public void Start() { lock (m_SyncObject){ if (m_Thread == null || !m_Thread.IsAlive){ m_Cts = new CancellationTokenSource(); m_Thread = new Thread(() => Listen(m_Cts.Token)) { IsBackground = true }; m_Thread.Start(); } } } public void Stop() { lock (m_SyncObject){ m_Cts.Cancel(); m_Listener.Stop(); } } private void Listen(CancellationToken token) { m_Listener.Start(); while (!token.IsCancellationRequested) { try{ var socket = m_Listener.AcceptSocket(); //do something with socket } catch (SocketException){ } } } } 

使用TcpListener.Pending()方法不是很好,因为你必须使用Thread.Sleep(miliseconds)或类似的东西 – 客户端接受之间会有一些延迟(睡眠中的毫秒数),这很糟糕。