Question

En C #, lors de la réception de données réseau avec les méthodes BeginReceive / EndReceive, y a-t-il une raison pour laquelle vous ne devriez pas traiter les paquets dès que vous les recevez? Certaines tâches peuvent être décentes et intensives. Je pose la question parce que j’ai vu des implémentations qui placent les paquets dans une file d’attente de traitement puis les traitent là. Cela me semble redondant, car, autant que je sache, les méthodes asynchrones aussi opèrent sur un pool de threads.

Était-ce utile?

La solution

Comme le souligne Mitch, vous devez pouvoir recevoir suffisamment de paquets pour avoir un message / cadre complet. Mais il n'y a aucune raison pour que vous ne commenciez pas immédiatement à traiter ce cadre et à émettre un autre certificat BeginReceive. En fait, si vous pensez que votre traitement peut prendre un certain temps, il est préférable de le transférer au pool de threads de travail plutôt que de bloquer un thread du pool d'E / S (c'est là que votre rappel sera déclenché).

De plus, à moins que vous n'espériez un faible nombre de connexions, créer un thread pour gérer chaque connexion n'est pas une approche très évolutive, même si elle présente l'avantage d'une certaine simplicité.

J'ai récemment écrit un article sur le traitement de données en pipeline à partir d'un socket réseau, que vous pouvez trouver ici .

Autres conseils

En règle générale, vous devez recevoir un nombre de paquets suffisant pour que les données soient "traitables".

IMO, il est préférable d’avoir un thread dont le travail reçoit des données et un autre pour le traiter.

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