Erweiterungen der Socketleistung in Version 3.5Socket Performance Enhancements in Version 3.5

Die System.Net.Sockets.Socket-Klasse wurde in Version 3.5 für die Verwendung von Anwendungen verbessert, die asynchrone Netzwerk-E/A verwenden, um die höchste Leistung zu erreichen.The System.Net.Sockets.Socket class has been enhanced in Version 3.5 for use by applications that use asynchronous network I/O to achieve the highest performance. Es wurde eine Serie neuer Klassen als Teil eines Satzes von Ergänzungen für die Socket-Klasse hinzugefügt, durch die ein alternatives asynchrones Muster bereitgestellt wird, das von spezialisierten Socketanwendungen mit hoher Leistung verwendet werden kann.A series of new classes have been added as part of a set of enhancements to the Socket class that provide an alternative asynchronous pattern that can be used by specialized high-performance socket applications. Diese Verbesserungen wurden speziell für Netzwerkserveranwendungen entwickelt, die hohe Leistung erfordern.These enhancements were specifically designed for network server applications that require high performance. Eine Anwendung kann die erweiterten asynchronen Muster ausschließlich oder nur in bestimmten Bereichen ihrer Anwendung nutzen (wenn z.B. große Datenmengen empfangen werden).An application can use the enhanced asynchronous pattern exclusively, or only in targeted hot areas of their application (when receiving large amounts of data, for example).

KlassenverbesserungenClass Enhancements

Die Hauptfunktion dieser Erweiterungen ist die Vermeidung der wiederholten Zuordnung und Synchronisierung von Objekten während asynchroner Socket-E/A mit hohem Volumen.The main feature of these enhancements is the avoidance of the repeated allocation and synchronization of objects during high-volume asynchronous socket I/O. Das derzeit von der Socket-Klasse für asynchrone Socket-E/A implementierte Begin/End-Entwurfsmuster erfordert, dass jedem asynchronen Socketvorgang ein System.IAsyncResult-Objekt zugewiesen wird.The Begin/End design pattern currently implemented by the Socket class for asynchronous socket I/O requires a System.IAsyncResult object be allocated for each asynchronous socket operation.

In den neuen Socket-Klassenerweiterungen werden asynchrone Vorgänge von wiederverwendbaren System.Net.Sockets.SocketAsyncEventArgs-Klassenobjekten beschrieben, die von der Anwendung zugewiesen und verwaltet werden.In the new Socket class enhancements, asynchronous socket operations are described by reusable System.Net.Sockets.SocketAsyncEventArgs class objects allocated and maintained by the application. Socketanwendungen mit hoher Leistung kennen die Menge an überlappenden Socketvorgängen, die aufrechterhalten werden müssen, am besten.High-performance socket applications know best the amount of overlapped socket operations that must be sustained. Die Anwendung kann so viele SocketAsyncEventArgs-Objekte erstellen wie nötig.The application can create as many of the SocketAsyncEventArgs objects that it needs. Wenn beispielsweise eine Serveranwendung zu jeder Zeit 15 Socketannahmevorgänge zur Verfügung haben muss, um eingehende Clientverbindungsraten zu unterstützen, kann sie diesem Zweck im Voraus 15 wiederverwendbare SocketAsyncEventArgs-Objekte zuweisen.For example, if a server application needs to have 15 socket accept operations outstanding at all times to support incoming client connection rates, it can allocate 15 reusable SocketAsyncEventArgs objects in advance for that purpose.

Das Muster zum Ausführen eines asynchronen Socketvorgangs mit dieser Klasse besteht aus den folgenden Schritten:The pattern for performing an asynchronous socket operation with this class consists of the following steps:

  1. Zuweisen eines neuen SocketAsyncEventArgs-Kontextobjekt oder Abrufen eines kostenlosen aus einem Anwendungspool.Allocate a new SocketAsyncEventArgs context object, or get a free one from an application pool.

  2. Festlegen von Eigenschaften für das Kontextobjekt für den durchzuführenden Vorgang (z.B. die Methode des Rückrufdelegaten und Datenpuffers).Set properties on the context object to the operation about to be performed (the callback delegate method and data buffer, for example).

  3. Aufrufen der entsprechenden Socketmethode (XxxAsync) zum Initiieren des asynchronen Vorgangs.Call the appropriate socket method (xxxAsync) to initiate the asynchronous operation.

  4. Wenn die asynchrone Socketmethode (XxxAsync) im Rückruf TRUE zurückgibt, dann fragen Sie die Kontexteigenschaften für den Abschlussstatus ab.If the asynchronous socket method (xxxAsync) returns true in the callback, query the context properties for completion status.

  5. Wenn die asynchrone Socketmethode (XxxAsync) im Rückruf FALSE zurückgibt, wurde der Vorgang synchron abgeschlossen.If the asynchronous socket method (xxxAsync) returns false in the callback, the operation completed synchronously. Die Kontexteigenschaften könnten möglicherweise für das Betriebsergebnis abgefragt werden.The context properties may be queried for the operation result.

  6. Verwenden Sie den Kontext für einen anderen Vorgang erneut, fügen Sie ihn wieder in den Pool ein, oder verwerfen Sie ihn.Reuse the context for another operation, put it back in the pool, or discard it.

Die Lebensdauer des neuen Kontextobjekts des asynchronen Socketvorgangs wird durch Verweise im Anwendungscode und asynchrone E/A-Verweise bestimmt.The lifetime of the new asynchronous socket operation context object is determined by references in the application code and asynchronous I/O references. Es ist nicht erforderlich, dass die Anwendung einen Verweis auf das Kontextobjekt des asynchronen Socketvorgangs beibehält, nachdem er als Parameter an eine der Methoden des asynchronen Socketvorgangs gesendet wurde.It is not necessary for the application to retain a reference to an asynchronous socket operation context object after it is submitted as a parameter to one of the asynchronous socket operation methods. Der Verweis bleibt bestehen, bis der Abschlussrückruf zurückgegeben wird.It will remain referenced until the completion callback returns. Es ist jedoch von Vorteil für die Anwendung, den Verweis auf das Kontextobjekt beizubehalten, damit er für einen weiteren asynchronen Socketvorgang wiederverwendet werden kann.However it is advantageous for the application to retain the reference to the context object so that it can be reused for a future asynchronous socket operation.

Siehe auchSee also