C# 如何中止内部使用AcceptTcpClient()的线程?

C# 如何中止内部使用AcceptTcpClient()的线程?,c#,C#,acceptcpclient()防止在我调用thrd.Abort()后退出应用程序 如何在侦听时退出应用程序?您应该能够通过关闭TcpListener来中断对AcceptTcpClient()的调用(这将导致阻塞AcceptTcpClient()引发异常)。您不应该中止线程,这通常是一个非常糟糕的主意,但在一些非常特殊的情况下除外 下面是一个简单的例子: class Program { static void Main(string[] args) { var l

acceptcpclient()
防止在我调用
thrd.Abort()后退出应用程序


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

您应该能够通过关闭
TcpListener
来中断对
AcceptTcpClient()的调用(这将导致阻塞
AcceptTcpClient()引发异常)
。您不应该中止线程,这通常是一个非常糟糕的主意,但在一些非常特殊的情况下除外

下面是一个简单的例子:

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键将停止侦听器,等待侦听器线程完成,然后应用程序将正常退出,不需要线程中止!

您可以:

使用BeginAcceptTcpClient()和End..代替: 见:

或者你可以:

创建TCP客户端并发送侦听器消息:

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

  • 中断listener.AcceptCpcClient()正在运行的循环。 (即CancelAsync())从外部和 循环时(!Tread.CancellationPending)

  • 创建TcpClient并向侦听器发送消息(并丢弃数据); TCP客户端请参阅:

  • 现在,您的线程可以继续执行以下操作: client.close()和listener.stop()

由于您没有提供上下文,我们根本无法理解这里的任何内容。您已经在另一个线程上运行了吗?是的,开始在另一个线程中侦听。