如何中止使用AcceptTcpClient()的线程?

时间:2013-04-25 12:15:42

标签: c#

AcceptTcpClient()在我致电thrd.Abort()后阻止应用退出。

如何在聆听时退出应用程序?

2 个答案:

答案 0 :(得分:8)

您应该可以通过关闭AcceptTcpClient()来中断对TcpListener的调用(这会导致阻止AcceptTcpClient()抛出异常。您应该不< / em>中止线程,除了一些非常具体的情况外,这通常是一个非常糟糕的主意。

以下是一个简短的例子:

class Program
{
    static void Main(string[] args)
    {
        var listener = new TcpListener(IPAddress.Any, 12343);
        var thread = new Thread(() => AsyncAccept(listener));
        thread.Start();
        Console.WriteLine("Press enter to stop...");
        Console.ReadLine();
        Console.WriteLine("Stopping listener...");
        listener.Stop();
        thread.Join();
    }

    private static void AsyncAccept(TcpListener listener)
    {
        listener.Start();
        Console.WriteLine("Started listener");
        try
        {
            while (true)
            {
                using (var client = listener.AcceptTcpClient())
                {
                    Console.WriteLine("Accepted client: {0}", client.Client.RemoteEndPoint);
                }
            }
        }
        catch(Exception e)
        {
            Console.WriteLine(e);
        }
        Console.WriteLine("Listener done");
    }
}

上面的代码在一个单独的线程上启动一个监听器,在控制台窗口按 Enter 将停止监听器,等待监听器线程完成,然后应用程序将正常退出,没有线程中止需要!

答案 1 :(得分:1)

你可以:

使用BeginAcceptTcpClient()和End ..代替: 见:https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.beginaccepttcpclient(v=vs.110).aspx

或者你可以:

创建一个TcpClient并发送您的侦听器消息:

因此(我猜你的线程中有一个循环):