我需要调用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)
或类似的东西 – 客户端接受之间会有一些延迟(睡眠中的毫秒数),这很糟糕。