2013-04-25 58 views
4

AcceptTcpClient()在我呼叫thrd.Abort()後阻止應用程序退出。如何中止使用AcceptTcpClient()的線程?

如何在聆聽時退出應用程序?

+0

從字面上有沒有辦法讓我們在這裏得到任何東西的理解,因爲你沒有提供任何上下文。你已經在另一個線程上運行了嗎? – 2013-04-25 12:20:31

+0

是的,開始在另一個線程中偵聽。 – Halabella 2013-04-25 12:26:23

回答

8

您應該能夠通過關閉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"); 
    } 
} 

上面的代碼開始於一個單獨的線程監聽器,按對T輸入他的控制檯窗口將停止監聽器,等待監聽器線程完成,然後應用程序將正常退出,不需要線程中止!

1

,你可以:

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

或者您可以:

創建TcpClient的和發送您的聽衆消息:

因此(我猜你在你的線程中有一個循環):