2010-07-22 7 views
3

Je crée un thread qui utilise TcpListener et quand mon application se ferme je voudrais que le thead se termine. Je peux appeler abort mais le thread est toujours vivant puisque TcpListener bloque avec AcceptTcpClient.TcpListener Timeout/about/quelque chose? Sans ASync?

Est-il possible de définir ou de définir un délai d'attente ou de faire quelque chose avec AcceptTcpClient? Je ne peux pas imaginer comment il serait utile s'il n'y a aucun moyen de l'empêcher de bloquer pour toujours. Mon code est en série et je voudrais qu'il reste ainsi donc est-il une solution sans utiliser BeginAcceptTcpClient? et écrire du code ASync?

+1

Encore une autre raison pour laquelle le code de socket de blocage ne devrait jamais être mis en production. La communication par socket asynchrone est la seule façon fiable de faire les choses à 100%. –

Répondre

10

Solution simple. VÉRIFIER avec en attente.

while(!server.Pending()) 
{ 
    Thread.Sleep(10); 
} 
TcpClient client = server.AcceptTcpClient(); 
3

Vous pouvez remplacer l'appel à AcceptTcpClient par un pour Socket.Select(), qui peut expirer.

var sockl = new ArrayList { listener.Server }; 
Socket.Select(sockl, null, null, _timeout_); 
if (sockl.Contains(listener.Server)) listener.AcceptTcpClient(); 
3

J'utilise AcceptTcpClient() dans une boucle while(!Disposing) d'accepter mes clients.
Lorsque je dispose de la classe, j'appelle la fonction Stop() du TcpListener et la valeur Disposing à true; comme ceci:

public class Server : IDisposable 
{ 
    private TcpListener _tcpListener; 
    private bool _isDisposing; 

    public void Start() 
    { 
     (new Thread(new ThreadStart(ListenForClients))).Start(); 
    } 

    private void ListenForClients() 
    { 
     this._tcpListener = new TcpListener(System.Net.IPAddress.Any, this.ListenPort); 
     this._tcpListener.Start(); 

     while (!_isDisposing) 
     { 
      //blocks until a client has connected to the server 
      TcpClient client = this._tcpListener.AcceptTcpClient(); 

      if (client == null) continue; 

      //create a thread to handle communication with connected client 
     } 
    } 

    public void Dispose() 
    { 
     this._isDisposing = true; 
     this._tcpListener.Stop(); 
    } 
} 

Notez que ceci est juste un petit extrait d'une classe de serveur ...

De cette façon, le programme peut rester bloqué sur la fonction AcceptTcpClient() et encore terminé. Toutefois, l'écoute elle-même doit également se produire sur un Thread (Start() function) distinct.