Question

I un morceau de code (sur un serveur) qui utilise la méthode asynchrone pour recevoir des données sur les prises comme suit:

asyncRes = connectionSocket.BeginReceive(receiveBuffer, 0, RECEIVING_BUFFER_SIZE,
    SocketFlags.None, out error, new AsyncCallback(ReceiveDataDone), null);

Dans le gestionnaire (ReceiveDataDone) de la prise, il y a des cas où Thread.Sleep (X) est utilisé afin d'attendre d'autres choses (mise en œuvre douteuse en effet). Je sais que c'est une conception discutable, mais je me demande si faire ce genre de code pourrait expliquer une explosion de fils créés dans ma demande en raison des autres prises en attente dans le serveur qui ont leur appelé ReceiveDataDone. (Lorsque plusieurs connexions sont gérées par le serveur le nombre de fils créé explose figuré). Je me demande comment méthode BeginReceive sur le travail de .NET, qui pourrait expliquer le grand nombre de fils que je vois.

Était-ce utile?

La solution

Vous ne doivent absolument pas effectuer toute sorte de bloquer l'action dans callbacks APM. Ceux-ci sont exécutés dans l'ThreadPool. Le ThreadPool est conçu pour l'invocation des tâches vécu courte. Si vous bloquez (ou prendre beaucoup de temps pour exécuter) vous liais (un nombre fini de) de fils et de provoquer la famine ThreadPool. Parce que le ThreadPool ne tourne pas facilement des threads supplémentaires (en fait, il est assez lent à démarrer les discussions supplémentaires), vous désengorgement du moment qui contrôle la vitesse du ThreadPool est autorisé à tourner de nouvelles discussions.

En dépit de répondre à une autre question, cette réponse que je fourni un certain temps, explique le même problème:

https://stackoverflow.com/a/1733226/14357

Autres conseils

Vous ne devriez pas utiliser Thread.sleep pour attendre dans les discussions ThreadPool ce qui provoque le fil à bloquer et il n'acceptera aucune workitems plus pour le moment il est bloqué.

Vous pouvez utiliser TimerCallback pour une telle utilisation Cas. Il laissera le calendrier ThreadPool autres travaux sur le fil d'attente dans l'intervalle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top