C# .NET Socket problème de connexion - une Seule utilisation de chaque adresse de socket est normalement autorisée

Je rencontre le problème suivant:

Une fois que je ferme mon WM6 application, puis essayez de démarrer à nouveau, j'obtiens cette erreur:
Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée au Système.Net.Les Sockets.Socket.Bind(point de Terminaison localEP)
au
Système.Net.Les Sockets.Socket.TcpListener.Start()
...

Je pense que cela est dû à l'intervalle de temps pour la connexion de délai d'attente, donc je voudrais fermez toutes les conections et le forcer à créer une nouvelle connexion, est-ce la bonne manière de procéder, ou est-il une autre façon de gérer cela?

Voici le code utilisé pour démarrer l'écoute:

///<summary>
///Listens Asynchronously to Clients, creates a recieveMessageHandler to process the read.
///
///Check WIKI, TODOS
///</summary>
///<returns></returns>
public void Listen()
{
    myTcpListener.Start();

    while (true)
    {
        //blocks until a client has connected to the server
        try
        {
            TcpClient myTcpClient = myTcpListener.AcceptTcpClient();
            DateTime now = DateTime.Now;
            //Test if it's necessary to create a client
            ClientConnection client = new ClientConnection(myTcpClient, new byte[myTcpClient.ReceiveBufferSize]);

            //Capture the specific client and pass it to the receive handler
            client.NetworkStream.BeginRead(client.Data, 0, myTcpClient.ReceiveBufferSize, r => receiveMessageHandler(r, client), null);
        }
        catch (Exception excp)
        {
            Debug.WriteLine(excp.ToString());
        }
    }
}
Fermer myTcpListener lors de l'arrêt.
Je ne, cependant, je suis d'appeler des Dll qui parfois le plantage de l'application et le code d'arrêt n'est pas appelé.
Vous avez besoin pour mieux gérer l'erreur. Par juste un plantage & quitter votre des ressources non managées autour de la pose, vous obtenez cette erreur. Bien que le CLR poignées de gestion de la mémoire pour vous pour les objets gérés, vous devez le faire pour des objets non gérés, tels que les fichiers & réseaux de connexions.
Le problème que j'ai c'est que je n'ai pas de moyen de gérer cette partie de Dll, l'utilisateur peut également bloquer l'application. Je suis ouvert aux suggestions sur la façon de gérer troisième partie se bloque et comment gérer l'utilisateur va dans le gestionnaire des tâches et la fermeture de l'application.

OriginalL'auteur Astronaut | 2013-03-13