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

Joh*_*ith 5 c# multithreading

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

TcpListener tcpListener = new TcpListener(IPAddress.Any, port);

tcpListener.Start();

while (true)
{
    TcpClient client = tcpListener.AcceptTcpClient();

    Task.Factory.StartNew(HandleClientCommunication, client);
}
Run Code Online (Sandbox Code Playgroud)

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

但是,是否有必要调用,TcpListener.Stop()因为应用程序此时已经关闭,并且由于我正在使用任务,因此该过程也结束了?

And*_*ych 5

尝试这样的事情:

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){                    
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 此解决方案的问题在于 AcceptSocket 方法是阻塞的。因此,在等待传入连接时,您无法优雅地停止侦听线程。 (2认同)