c# .net - Annullamento di una chiamata Socket.xxxxAsync




client receiveasync (3)

La causa più probabile è quando riutilizzi SocketAsyncEventArgs che stai chiamando:

SAE.Completed + = new EventHandler (SocketEventArg_Completed);

In questo modo, la richiamata verrà richiamata più volte !!!

Assicurati di impostare solo il gestore completato una volta.

Dopo aver chiamato Socket.Shutdown, Socket.Close e Socket.Disconnect, sembra che Socket.ReceiveAsync non si interrompa. I tentativi di riutilizzare l'oggetto SocketAsycEventArgs utilizzato nella chiamata ReceiveAsync (suggerito nella documentazione come best practice) provocano l'errore:

Un'operazione di socket asincrono è già in corso utilizzando questa istanza SocketAsyncEventArgs

Cosa devo fare per ottenere ReceiveAsync per rilasciare la presa su questa istanza SocketAsyncEventArgs?

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


Non sembra essere un modo per interrompere la ricezione asincrona.

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

Questo è dimostrato nell'esempio mostrato qui . 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.


public static T GetEnum<T>(this string description) where T : struct
{
    return (T)Enum.Parse(typeof(T), description);
}

Risponde alla tua domanda?





c# .net sockets