2008-09-19 13 views
4

Ma classe C# doit pouvoir traiter un volume élevé d'événements reçus via une connexion de socket de style flux tcp. Le volume des messages d'événement reçus du serveur tcp par le socket de la classe est complètement variable. Par exemple, parfois, il ne recevra qu'un message d'événement sur une période de dix secondes et, à d'autres moments, il recevra soixante messages d'événement en une seconde. J'utilise Socket.ReceiveAsync pour recevoir des messages.Traitement de la file d'attente des événements de socket évolutif

ReceiveAsync renvoie true si l'opération de réception est en attente ou false s'il existe déjà des données sur le réseau et que l'opération de réception est terminée de manière synchrone. Si l'opération est en attente, le Socket appellera mon rappel sur un thread d'achèvement d'E/S, sinon j'appelle mon propre rappel dans le thread en cours (IOC). En outre, mélangé avec des messages d'événement, je reçois également des réponses aux commandes qui ont été envoyées à ce serveur tcp. Les messages de réponse sont traités immédiatement; individuellement, en tirant un ouvrier de threadpool. Cependant, je voudrais mettre en file d'attente des messages d'événement jusqu'à ce que j'en ai "assez" (N) OU jusqu'à ce qu'il n'y en ait plus sur le réseau ... puis déclenche un traitement de lots de messages d'événement . De plus, je veux que tous les événements soient traités séquentiellement, donc je veux seulement qu'un employé du pool de threads y travaille à la fois.

Le processeur des messages d'événement doit uniquement copier le tampon de message dans un objet, déclencher un événement, puis relâcher le tampon de message dans le pool de mémoire tampon. Donc, ma question est ... quelle est selon vous la meilleure stratégie pour y parvenir?

Avez-vous besoin de plus d'infos? Faites le moi savoir. Merci!!

Répondre

5

Je n'appellerais pas un volume élevé de 60 événements par seconde. À ce bas niveau d'activité, toute méthode de traitement de socket est parfaite. J'ai traité 5 000 événements par seconde sur un seul thread en utilisant du matériel beaucoup moins performant que les machines actuelles, en utilisant simplement select. Je dirai que si vous cherchez à l'échelle, le transfert des messages individuellement entre les threads va être un désastre. Vous devez batch ou vos commutateurs de contexte vont tuer les performances.

Questions connexes