WSACancelBlockingCall exception

Ok, j'ai une étrange exception générée à partir de mon code qui me préoccupe depuis des siècles.

System.Net.Sockets.SocketException: A blocking operation was interrupted by a call to WSACancelBlockingCall
   at System.Net.Sockets.Socket.Accept()
   at System.Net.Sockets.TcpListener.AcceptTcpClient()

MSDN n'est pas très utile sur ce : http://msdn.microsoft.com/en-us/library/ms741547(SV.85).aspx et je ne sais même pas comment commencer le dépannage de celui-ci. C'est seulement jeté 4 ou 5 fois par jour, et jamais dans notre environnement de test. Seulement dans les sites de production, et sur TOUS les sites de production.

J'ai trouvé beaucoup de postes posent à propos de cette exception, mais pas de réponses définitives à ce qui en est la cause et comment le manipuler ou de le prévenir.

Le code s'exécute dans un autre thread d'arrière-plan, la méthode commence par :

public virtual void Startup()
    {
     TcpListener serverSocket= new TcpListener(new IPEndPoint(bindAddress, port));    
        serverSocket.Start();

puis-je exécuter une boucle de mettre toutes les nouvelles connexions que les emplois dans un thread séparé de la piscine. Il devient de plus en plus complexe en raison de l'application de l'architecture, mais en gros:

   while (( socket = serverSocket.AcceptTcpClient()) !=null) //Funny exception here
    {
         connectionHandler = new ConnectionHandler(socket, mappingStrategy);
         pool.AddJob(connectionHandler);
    }
  }

À partir de là, le pool dispose de son propre fils, qui prennent soin de chaque emploi dans son propre thread, séparément.

Ma compréhension est que AcceptTcpClient() est un appel bloquant, et qu'en quelque sorte c'est dire le fil de cesser de bloquer et de continuer l'exécution.. mais pourquoi? Et que suis-je censé faire? Il suffit de prendre l'exception et l'ignorer?


Bien, je pense à un autre thread est la fermeture de la socket, mais ce n'est certainement pas de mon code.
Ce que je voudrais savoir c'est: est-ce socket fermée par le client de connexion (de l'autre côté de la prise) ou est-il fermé par mon serveur. Parce que c'est à ce moment, chaque fois que cette exception se produit, il shutsdown mon port d'écoute, de manière efficace la fermeture de mon service. Si c'est fait à partir d'un emplacement distant, alors c'est un problème majeur.

Sinon, cela pourrait être tout simplement le serveur IIS éteindre mon application, et donc l'annulation de tous mes threads d'arrière-plan et le blocage des méthodes?

InformationsquelleAutor Radu094 | 2008-08-28