2009-02-19 11 views
10

Po wywołaniu Socket.Shutdown, Socket.Close i Socket.Disconnect okazuje się, że Socket.ReceiveAsync nie przerywa. Próby ponownego wykorzystania obiektu SocketAsycEventArgs używany w zaproszeniu ReceiveAsync (sugerowana w dokumentacji jako najlepszej praktyki) prowadzą do błędu:Anulowanie wywołania Socket.xxxxAsync

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

Co muszę zrobić, aby uzyskać ReceiveAsync aby zwolnić jej przyczepność na ten przykład SocketAsyncEventArgs?

Edytuj: Pracowałem nad tym, sygnalizując oczekujący odbiór i nie wykonując żadnego czyszczenia, dopóki nie nadejdzie odbiór (tj. Zakończono wysyłanie). Nie czuje się jednak zbyt dobrze. Czy nie można tego po prostu przerwać, tak jak API WebRequest?

Odpowiedz

6

Wygląda na to, że nie ma sposobu na przerwanie odbioru asynchronicznego.

Po zamknięciu gniazda wymusza to odebranie do końca, a właściwość SocketError parametru SocketAsyncEventArgs w metodzie wywołania zwrotnego będzie miała wartość SocketError.OperationAborted. Po napotkaniu tego warunku można przywrócić obiekt SocketAsyncEventArgs do puli do ponownego użycia.

Zostało to wykazane w pokazanym przykładzie here. W szczególności spójrz na metodę ProcessReceive(), która wywołuje metodę CloseClientSocket(), gdy e.BytesTransferred == 0 lub . Metoda CloseClientSocket() polega na tym, że obiekt SocketAsyncEventArgs jest zwracany do puli.

0

Najprawdopodobniej przyczyną jest po ponownym SocketAsyncEventArgs że dzwonisz:

SAE.Completed + = new EventHandler (SocketEventArg_Completed);

Takie działanie spowoduje, że Twój oddzwonienie zostanie wywołane wiele razy !!!

Pamiętaj, aby ustawić tylko jeden zakończony moduł obsługi.

+0

Nie próbuje odpowiedzieć na postawione pytanie. Problem z OP polega na próbie ponownego użycia 'SocketAsyncEventArgs' przed uruchomieniem programu' Completed'. – binki

Powiązane problemy