Ich versuche, NetworkStream.ReadAsync() zu verwenden, um Daten zu lesen, aber ich kann nicht finden, wie die einmal aufgerufene ReadAsync() abgebrochen wird. Als Hintergrund wird mir der NetworkStream von einem verbundenen BluetoothClient-Objekt (von 32Feet.NET Bluetooth Library) zur Verfügung gestellt.Wie NetworkStream.ReadAsync Abbrechen ohne Stream zu schließen
Der aktuelle Get-it-working-Code, den ich versuche, ist unten.
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");
Der Code funktioniert Empfangsdaten und Looping stoppt, wenn die continueReading Flag auf false gesetzt ist und Daten empfangen werden, aber bis Daten empfangen werden, wird es vorbei an der ReadAsync() Linie nicht fortgesetzt werden. Ich kann nicht sehen, wie ich den Anruf abbringe, ohne Daten zu empfangen.
Ich bin mir bewusst, dass es eine Überlastung der ReadAsync, die eine CancellationToken bietet, aber es scheint, dass als Network den Standard ReadAsync Verhalten nicht außer Kraft setzt, wird der Token ignoriert (siehe NetworkStream.ReadAsync with a cancellation token never cancels).
Ich habe versucht, den zugrunde liegenden Stream zu schließen, und dies führt dazu, dass der wartende ReadAsync-Aufruf ObjectDisposedException auslöst und die darunterliegende Bluetooth-Verbindung ebenfalls geschlossen wird. Idealerweise möchte ich die Verbindung mit dem Gerät nicht vollständig trennen, nur um das Lesen zu stoppen. Es scheint keine saubere Methode zu sein, es zu tun, und es ist unnötig, den gesamten Stream abzureißen, nur um den Aufruf von va ReadAsync() zu unterbrechen.
Irgendwelche Ratschläge?
ich Überprüfung DataAvailable vergessen hatte! Danke für den Beispielcode und den Link zu Stephen Toubs Artikel. Beide sind hilfreich für mich zu erreichen, dass ich danach bin. Vielen Dank! – Swampie