2010-08-24 13 views
4

Un service Windows a un socket ouvert qui reçoit des données (sur un thread séparé)Comment fermer un socket bloqué

En réponse au service OnShutdown Je voudrais signaler thread de travail à l'arrêt, mais il est actuellement bloqué sur le Receive.

Pour le moment, je suis sur Receive pour vérifier si une demande d'arrêt est en attente. Y at-il une meilleure approche, plutôt que d'attendre le délai d'attente pour notifier le thread de travail pour arrêter de recevoir et passer par sa logique d'arrêt?

+1

La meilleure approche consiste à utiliser des sockets asynchrones. Ils évoluent beaucoup mieux de toute façon. –

+0

Dans un sens, c'est asynchrone. Certes, je n'utilise pas BeginReceive - mais même si je l'étais, comment pourrais-je obtenir ce thread pour arrêter la réception alors qu'il attend des données. –

Répondre

0

Appel d'interruption() sur le fil devrait faire sortir de toute opération de blocage: http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt.aspx

Notez que cela entraînera un ThreadInterruptedException (lors du blocage), que vous devez gérer de façon appropriée.

+0

ce serait génial, mais il semble que le thread n'est pas bloqué par le Socket.Receive de telle manière que cette interruption soit entendue. –

2

Appelez Socket.Close. La méthode Socket.Receive déclenchera immédiatement une exception en le débloquant.

L'exception est une exception IO.IOException, qui a une exception SocketException comme une exception interne. Le code d'erreur natif de l'exception interne est 10004.

Questions connexes