2009-02-19 15 views
10

Nach dem Aufrufen von Socket.Shutdown, Socket.Close und Socket.Disconnect scheint Socket.ReceiveAsync nicht abzubrechen. Versuche, das SocketAsycEventArgs Objekt im ReceiveAsync Aufruf verwendet wiederzuverwenden Ergebnis in den Fehler (in der Dokumentation als Best Practice empfohlen):Abbrechen eines Socket.xxxxAsync-Aufrufs

An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance

Was muss ich tun ReceiveAsync zu bekommen ihren Griff auf dieser SocketAsyncEventArgs Instanz freizugeben?

Edit: Ich habe dies umgangen, indem ein ausstehender Empfang markiert und keine Bereinigung durchgeführt, bis der Empfang kommt (d. H. Abgeschlossen wird ausgelöst). Fühlt sich aber nicht so gut an. Kann es nicht einfach abgebrochen werden, wie die WebRequest API?

Antwort

6

Es scheint keine Möglichkeit zu geben, den asynchronen Empfang abzubrechen.

Wenn der Socket geschlossen ist, erzwingt dies, dass der Empfang abgeschlossen wird, und die SocketError-Eigenschaft des SocketAsyncEventArgs-Parameters für Ihre Callback-Methode hat den Wert SocketError.OperationAborted. Wenn diese Bedingung auftritt, können Sie das SocketAsyncEventArgs-Objekt an den wiederverwendbaren Pool zurückgeben.

Dies wird im gezeigten Beispiel gezeigt here. Sehen Sie sich speziell die ProcessReceive() -Methode an, die die Methode CloseClientSocket() aufruft, wenn e.BytesTransferred == 0 oder e.SocketError != SocketError.Success. Die CloseClientSocket() -Methode ist, wo das SocketAsyncEventArgs-Objekt an den Pool zurückgegeben wird.

0

wahrscheinlichste Ursache ist, wenn SocketAsyncEventArgs Wiederverwendung, die Sie anrufen:

SAE.Completed + = new Eventhandler (SocketEventArg_Completed);

Dadurch wird Ihr Rückruf mehrmals aufgerufen !!!

Stellen Sie sicher, dass Sie den Abgeschlossenen Handler nur einmal festlegen.

+0

Dies versucht nicht, die gestellte Frage zu beantworten. Das Problem des OPs kommt von dem Versuch, den "SocketAsyncEventArgs" zu verwenden, bevor der 'Completed'-Handler ausgelöst wird. – binki

Verwandte Themen