Domanda

Io sto usando un NetworkStream & TcpClient per ricevere in modo asincrono dati utilizzando BeginRead. Ho bisogno di applicare un time-out a questa operazione, in modo tale che dopo un determinato periodo di tempo di lettura verrà interrotta.

Per quanto sono in grado di dire, questo non è supportato su NetworkStream o TcpClient - c'è una proprietà ReceiveTimeout, ma questo sembra vale solo per il sincrono equivalente - 'Leggi'

.

Anche la classe Socket sottostante non sembra timeout di supporto nel suo metodo BeginReceive.

Ho cercato su questo tema e la risoluzione solo suggerito che ho visto è quello di impostare un altro thread in background per annullare l'operazione se non completato entro il periodo di timeout. Questo mi sembra un hack orribile. Sicuramente c'è un modo migliore?

È stato utile?

Soluzione

E 'l'unico modo per farlo, perché quando si utilizza un'operazione asincrona, il filo che ha avviato l'operazione è spento a fare qualcos'altro. Il timeout è disponibile con la versione sincrona perché il thread di esecuzione è bloccato fino al completamento dell'operazione di lettura.

Se si dovrà utilizzare un thread in background per annullare l'operazione, però, ci sarebbe non essere più molto senso di continuare ad utilizzare l'asincrono Begin / End metodi. Se avete intenzione di spin off un thread in background, basta eseguire un'operazione sincrona Leggi dal thread in background, e quindi è possibile utilizzare il ReceiveTimeout.

Altri suggerimenti

ManualResetEvent con un certo valore di timeout per segnale quando il tuo compito è finito. Se il tempo è scaduto prima che venga segnalato, poi si sa che un'operazione asincrona mai completato.

private ManualResetEvent receiveDone = new ManualResetEvent(false);

receiveDone.Reset();
socket.BeginReceive(...);
if(!receiveDone.WaitOne(new TimeSpan(0, 0, 0, 30))) //wait for 30 sec.
    throw new SocketException((int)SocketError.TimedOut);

All'interno BeginReceive richiamata, l'uso

private void ReceiveCallBack(IAsyncResult ar)
{
    /** Use ar to check if receive is correct and complete */
    receiveDone.Set();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top