Nicht blockierende Sockets vs BeginXXX vs SocketAsyncEventArgs

8

Kann mir bitte jemand über aktuelle .NET Socket-Techniken aufklären?

  1. Nicht blockierende Sockets

    Wenn ich Socket.Blocking = false setze und Async-Operationen verwende - was wird passieren?

    Gibt es eine Möglichkeit, mehrere nicht blockierende Sockets abzufragen, anstatt sie einzeln auf Verfügbarkeit zu prüfen (etwas wie trivial select () oder irgendeinen anderen Mechanismus, der etwas mit IOCP zu tun hat), abgesehen von Socket.Select ( )?

  2. BeginXXX und SocketAsyncEventArgs

    Arbeiten sie an Sockeln unter der Haube und verstecken nur die Thread-Erstellung?

    Ist die manuelle Erstellung von Threads gleich der Verwendung von BeginXXX-Methoden?

    Gibt es noch andere Vorteile bei der Verwendung von SocketAsyncEventArgs, dann erlaubt es, einen Pool von Sockets und alles, was damit zusammenhängt, zu erstellen?

Und eine abschließende Frage: Wenn App als eine Art stark geladener binärer Proxy arbeitet, wobei die meiste Logik in einem einzelnen Thread erledigt wird - was bietet eine bessere Skalierbarkeit: blockierungsfreie Vorgehensweise oder asynchrone Operationen?

    
Aquilae 27.02.2012, 10:48
quelle

1 Antwort

2

1: Socket.Select sollte das tun, obwohl ich nicht dazu tendiere, diesen Ansatz persönlich zu verwenden; insbesondere diese IList werden bei hohen Volumina nervig

2: Nein, andersherum; Die Blockierungsoperationen verwenden im Wesentlichen das Nicht-Blockieren im Hintergrund, aber mit Gates. Nein, sie erstellen keine Threads unter der Haube - es sei denn, Sie zählen den Callback, wenn etwas eingeht. Ich habe hier ein Beispiel, das 12k Verbindungen mit SocketAsyncEventArgs dient - die Thread-Anzahl ist etwa 20. Unter den Absichten von SocketAsyncEventArgs ist das:

  • es ist viel einfacher effektiv zu puffern, ohne dass viele Objekte pro Operation erstellt / gesammelt werden müssen
  • Sie können das Szenario "Daten jetzt verfügbar" sehr effizient verarbeiten, ohne dass ein Rückruf erforderlich ist (wenn die Methode false zurückgibt, sollten Sie die Daten sofort verarbeiten - es wird kein Rückruf erfolgen)

Für Skalierbarkeit: asynchron

    
Marc Gravell 27.02.2012, 10:58
quelle