2009-02-19 10 views
10

Dopo aver chiamato Socket.Shutdown, Socket.Close e Socket.Disconnect, sembra che Socket.ReceiveAsync non interrompa. I tentativi di riutilizzare l'oggetto SocketAsycEventArgs utilizzato nella chiamata ReceiveAsync (suggerito nella documentazione come best practice) risultato l'errore:Annullamento di una socket.xxxx Chiamata di sincronismo

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

Che cosa devo fare per ottenere ReceiveAsync per rilasciare la sua presa su questa istanza SocketAsyncEventArgs?

Modifica: ho lavorato su questo segnalando una ricezione in sospeso e non facendo alcuna pulizia fino a quando la ricezione non arriva (cioè completato viene inviato). Non si sente troppo bene però. Non può essere semplicemente abortito, come l'API WebRequest?

risposta

6

Non sembra essere un modo per interrompere la ricezione asincrona.

Quando il socket è chiuso, forza la ricezione a completare e la proprietà SocketError del parametro SocketAsyncEventArgs al metodo di callback avrà un valore di SocketError.OperationAborted. Quando si verifica questa condizione, è possibile restituire l'oggetto SocketAsyncEventArgs al pool riutilizzabile.

Questo è dimostrato nell'esempio illustrato here. In particolare, guarda il metodo ProcessReceive(), che chiama il metodo CloseClientSocket() quando e.BytesTransferred == 0 o e.SocketError != SocketError.Success. Il metodo CloseClientSocket() è il punto in cui l'oggetto SocketAsyncEventArgs viene restituito al pool.

0

causa più probabile è quando si riutilizza SocketAsyncEventArgs che si sta chiamando:

SAE.Completed + = new EventHandler (SocketEventArg_Completed);

In tal caso, la chiamata verrà richiamata più volte !!!

Assicurarsi di impostare solo il gestore completato una volta.

+0

Questo non tenta di rispondere alla domanda posta. Il problema dell'OP deriva dal tentativo di riutilizzare 'SocketAsyncEventArgs' prima che venga eseguito il gestore' Completed'. – binki

Problemi correlati