Sockel hat diese neue asynchrone Methoden seit .NET 3.5 zur Verwendung mit SocketAsyncEventArgs (z. B. Socket.SendAsync() ), was den Vorteil hat, dass sie unter der Haube IO-Abschluss-Ports verwenden und die Notwendigkeit einer ständigen Zuweisung vermeiden.
Wir haben eine Klasse namens UdpStream mit einer einfachen Schnittstelle - nur StartSend und eine Abgeschlossen Veranstaltung. Es weist zwei SocketAsyncEventArgs zu, eines zum Senden und eines zum Empfangen. Das StartSend-Ereignis sendet einfach eine Nachricht mit SendAsync und wird etwa 10 Mal pro Sekunde aufgerufen. Wir verwenden das Ereignis Completed für die SocketAsyncEventArgs für den Empfang, und nachdem jedes Ereignis behandelt wurde, rufen wir ReceiveAsync auf, so dass eine Empfangsschleife entsteht. Auch hier empfangen wir etwa 10 Mal pro Sekunde.
Unser System muss bis zu 500 dieser UdpStream Objekte. Mit anderen Worten: Unser Server wird gleichzeitig mit 500 verschiedenen IP-Endpunkten kommunizieren.
Ich bemerke in den MSDN SocketAsyncEventArgs-Beispielen, dass sie N x SocketAsyncEventArgs zuweisen, eine für jede ausstehende Empfangsoperation, die Sie zu einem Zeitpunkt behandeln möchten. Mir ist nicht ganz klar, wie sich dies auf unser Szenario bezieht - es scheint mir, dass wir vielleicht nicht den Vorteil von SocketAsyncEventArgs erhalten, weil wir einfach einen pro Endpunkt zuweisen. Wenn wir mit 500 empfangenen SocketAsyncEventArgs enden, nehme ich an, dass wir keinen Nutzen daraus ziehen werden. Vielleicht erhalten wir noch einige Vorteile von IO Completion Ports?
-
Verwendet dieser Entwurf SocketAsyncEventArgs korrekt, wenn Skalierung auf 500?
-
Gibt es für den Fall, dass ein einziger "UdpStream" verwendet wird, eine Vorteil der Verwendung von SocketAsyncEventArgs gegenüber der älteren Begin/End-API?