Sto cercando di utilizzare NetworkStream.ReadAsync() per leggere i dati ma non riesco a trovare come annullare ReadAsync() una volta chiamato. Per lo sfondo, NetworkStream mi viene fornito da un oggetto BluetoothClient connesso (dalla libreria Bluetooth 32Feet.NET).Come annullare NetworkStream.ReadAsync senza chiudere il flusso
L'attuale codice get-it-working che sto cercando è riportato di seguito.
int bytesRead;
while (this.continueReading)
{
bytesRead = await this.stream.ReadAsync(this.buffer, 0, (int)this.buffer.Length);
Console.WriteLine("Received {0} bytes", bytesRead);
}
Console.WriteLine("Receive loop has ended");
Il codice funziona dati ricezione sottili, e si arresta loop se il flag continueReading è impostato su false e vengono ricevuti i dati, ma fino alla ricezione dati non procederà oltre la linea ReadAsync(). Non riesco a vedere come interrompere la chiamata senza ricevere dati.
Sono consapevole che v'è un sovraccarico di ReadAsync che fornisce un CancellationToken, ma sembra che come NetworkStream non ignorare il comportamento predefinito ReadAsync, il token viene ignorato (vedi NetworkStream.ReadAsync with a cancellation token never cancels).
Ho provato a chiudere il flusso sottostante e questo causa la chiamata ReadAsync in attesa per il lancio di ObjectDisposedException e anche la connessione Bluetooth sottostante viene chiusa. Idealmente non voglio interrompere completamente la connessione con il dispositivo solo per interrompere la lettura. Non sembra un modo pulito di farlo, e sembra inutile abbattere l'intero flusso solo per interrompere la chiamata a ReadAsync().
Qualche consiglio?
Avevo dimenticato il controllo DataAvailable! Grazie per il codice di esempio e per il collegamento all'articolo di Stephen Toub. Entrambi saranno utili per me per ottenere ciò che cerco. Grazie! – Swampie