2013-02-04 1 views
1

J'ai un service Windows qui exécute un thread d'arrière-plan séparé. A l'intérieur du thread, il démarre un serveur TCP qui écoute les clients utilisant TcpListener.Comment mettre fin au service Windows en bloquant l'appel à l'aide de TcpListener

Je voudrais savoir comment je peux fermer le service gracieusement quand il y a un blocage lu comme ceci:

listener.AcceptTcpClient(); 

J'ai trouvé que, apparemment, un service Windows peut annuler tous les autres fils aussi longtemps car ils sont configurés en tant que threads d'arrière-plan, mais que se passe-t-il si l'un des threads bloque? Cela fait-il une différence et si oui, quelle est la meilleure façon de gérer cette situation?

Répondre

0

Le meilleur moyen sera d'appeler listener.Close() à l'événement d'arrêt du service. Il va annuler l'appel de blocage avec SocketException.

L'état du fil (bloqué ou en cours d'exécution) n'affecte pas le fait que le fil est en arrière-plan. Donc, si vous appelez listener.AcceptTcpClient() à partir d'un thread d'arrière-plan, il sera toujours annulé lorsque le service s'arrête,

+0

Que faire si je n'ai pas appelé listener.Close()? Est-ce mauvais? – jaffa

+0

@jaffa comportement attendu sage - toujours très bien. Les deux dernières lignes de ma réponse expliquent cela. – Anri

Questions connexes