Ich suche nach den Best Practices, um die folgenden Anforderungen zu erfüllen:
Ich frage mich, ob das Framework, in dem ich BeginReceive
und EndReceive
mit implementiertem IAsyncResult-Callback verwende, Stand der Technik ist, wenn ich auf .NET 4.5 ziele. Gibt es eine bessere Lösung, z. B. die Verwendung von NetworkStream oder andere API-Optionen? Was mich wirklich mit der BeginReceive / EndReceive-Implementierung stört ist, dass ich nach EndReceive wieder BeginReceive aufrufen muss und den Rückruf erneut registrieren muss. Das klingt für mich nach einem schrecklichen Aufwand. Warum können neue Daten zu keinem Zeitpunkt async hinzugefügt werden und gleichzeitig ein anderer Kontext vollständige Nachrichten erstellen, die dann durch ein erhöhtes Ereignis geleitet werden?
Das Argument der Verwendung von IAsyncResult wird oft dadurch gegeben, dass die Thread-Behandlung erledigt ist, aber was gegen folgendes spricht: Einen NetworkStream verwenden und einfach vom Stream lesen und schreiben. Wie erwähnt, werden nur String-Nachrichten ausgetauscht und jede Nachricht pro Protokoll wird durch das Zeilenvorschubzeichen als abgeschlossen markiert. Ein separater Task / Thread würde einen Streamreader (basierend auf dem Netzwerkstream) durch ReadLine()
abfragen. Es kann wahrscheinlich nicht einfacher werden, oder?
Was ich im Grunde frage ist, wie kann der folgende Code wirklich async gemacht werden?
%Vor%Derzeit gibt es keinen aktuellen Standard oder eine gängige Praxis. Sie haben eine Reihe von Möglichkeiten mit Vor- und Nachteilen:
Task
s und verwenden Sie async
/ await
.
async
-Operationen selbst in einer "unendlichen" Schleife verwalten und die Zustandsverwaltung für jede Verbindung verwalten. *Async
Methoden in Task
s und verwenden Sie sie async
/ await
.
Für Ihre Situation (einige hundert Nachrichten pro Sekunde auf weniger als einhundert Sockets) würde ich meine Nito.Async-Bibliothek empfehlen. Es ist die einfachste dieser Optionen, um zu arbeiten.
In Bezug auf Ihr Protokoll müssen Sie die \n
s von Hand analysieren und Ihre Pufferung selbst durchführen. (Das gilt für alle oben genannten Optionen.)
Gemäß meiner Empfehlung verwenden Sie bitte die neue Async-Form von XXXReceive
und 'XXXSend' (wobei XXX für Begin
und End
steht), die neuen verfügbaren Methoden sind ReceiveAsync und SendAsync Methoden, die SocketAsyncEventArgs , um den Socket und andere Informationen zu den Callback-Event-Handlern zu übergeben.
Ich hatte ein gutes funktionierendes Beispiel von Socket-Client und -Server im msdn-Archiv gesehen, das bis zu 500 Verbindungen skalierbar war (wie ich es in einer der Projektanpassungen davon getestet hatte), aber derzeit kann ich den Link vom googlen nicht finden. Aber hier ist ein weiterer Link von msdn Archiv zum gleichen Thema hoffentlich wird es Ihnen helfen - Holen Sie sich näher an die Wire mit leistungsstarken Sockets in .NET ..
Zunächst kann ich Ihnen nur eine Idee für die endgültige Implementierung und wenn möglich einige kurze Beispielcode-Snippets geben. ok hier geh ich mit mehr Details
Ich denke, Sie können zum Link des letzten Absatzes springen. ;)
Lassen Sie mich einmal hervorheben, weil ich möchte, ich sagte SendAsync
und ReceiveAsync
nicht BeginReceive/EndReceive
und BeginSend/EndSend
, d. h. Event-based Async Pattern (EAP)
Der Vorteil der asynchronen Form der Socket-Methoden besteht darin, dass es sich um einen ausnahmslosen Ansatz für die Socket-Programmierung handelt, der sich schneller als BeginSend / EndSend-Methoden erweisen kann.
Hier ist der Link für das Beispiel, von dem ich herausgefunden habe, dass es bis zu 500 PARALLEL-Verbindungen nützlich ist - Netzwerkbeispiele für .NET v4.0
Sie müssen die Funktion "Warten / Asynchron" von .NET 4.5 verwenden. Hier ist das .NET 4.5 Code-Snippet, das die Verwendung von WebSocket
class zeigt, welches auch an Socket
implements angepasst werden kann - Unterstützung für das WebSockets-Protokoll (Ich vermute, WebSockets AspNetWebSocketContext
wird Sockets SocketAsyncEventArgs
sein)
Ich habe Warten auf Socket-Operationen Beispielcode von gefunden MSDN - Parallel Programming-Team-Blog , das zur Implementierung von "wait / async" aus .NET 4.5 Framework nützlich sein kann.
Ich hoffe, dies erweist sich als hilfreich für Sie.
Tags und Links c# sockets asynchronous tcp networkstream