AcceptTcpClient()
在我致电thrd.Abort()
后阻止应用退出。
如何在聆听时退出应用程序?
答案 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并发送您的侦听器消息:
因此(我猜你的线程中有一个循环):
打破其中listener.AcceptTcpClient()正在运行的循环。 (即CancelAsync())来自外部和 循环时(!Tread.CancellationPending);
创建一个TcpClient并向监听器发送一条消息(并丢弃数据); TcpClient请参阅:https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(v=vs.110).aspx