J'ai fait mes recherches et je sais que la meilleure façon de mettre en œuvre un serveur socket haute performance est généralement la suivante: utiliser des opérations de socket async (SocketAsyncEventArgs/Operations pour des performances optimales) et le rappel asynchrone, placez la requête dans une file d'attente de traitement traitée par un pool de threads.Serveur Socket Super Haute Performance - Détails de l'implémentation
Mes questions pour ce modèle de traitement - d'avoir les meilleures performances:
1) lorsque l'opération doit « fin » de la prise appelée (par exemple EndAccept ou EndReceive)? devrait-il être appelé sur le thread de rappel (IOCP) avant de mettre en file d'attente la demande? ou appelé lorsque la demande est retirée de la file d'attente et est traitée (thread de travail)?
2) cette question dépend de la réponse à # 1. quand doit-on appeler la prochaine opération "Begin"? Devrions-nous l'appeler avant que nous appelons EndOperation même ou devrions-nous l'appeler immédiatement après EndOperation (avant la demande de mise en file d'attente/de traitement)? 3) la file d'attente de traitement peut-elle simplement être le pool d'unités d'exécution .NET? Quels sont les avantages/inconvénients de l'utilisation du pool de threads .NET par rapport au déploiement de votre propre file d'attente de traitement synchronisée?
Toute aide est grandement appréciée.
Vous n'avez pas bien fait vos recherches: SocketAsyncEventArgs et Begin/End sont deux modèles différents. Vous n'appelez pas par ex. EndReceive lorsque vous avez appelé ReceiveAsync. – dtb
En ce qui concerne # 1, les opérations 'EndXXX' devraient être appelées à l'intérieur du callback et à l'extérieur aussi (si la requête s'est terminée de manière synchrone). C'est un peu difficile de bien faire les choses. Voir ce [post] (http: //blogs.msdn.com/b/mjm/archive/2005/05/04/414793.aspx) pour une explication. Si vous voulez éviter cela et utiliser une solution plus élégante, je vous suggère d'aller avec TPL et son 'FromAsync'. –
@dtb vous avez raison, le modèle est légèrement différent, mais les deux modèles suivent le concept global de traitement asynchrone via les callbacks et mes questions sont toujours pertinentes pour les deux – shyneman