Я пытаюсь использовать NetworkStream.ReadAsync() для чтения данных, но я не могу найти, как отменить вызов ReadAsync(). Для фона NetworkStream предоставляется мне подключенным объектом BluetoothClient (из библиотеки Bluetooth 32Feet.NET).Как отменить NetworkStream.ReadAsync без закрывающего потока
Текущий код ввода, который я пытаюсь, приведен ниже.
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");
код работает прекрасные приема данных, и остановит зацикливание, если флаг continueReading установлен в ложь и данные поступают, но пока данные получены не будет проходить мимо линии ReadAsync(). Я не вижу, как прервать вызов без получения данных.
Я знаю, что есть перегрузка ReadAsync, которая предоставляет CancellationToken, но кажется, что, поскольку NetworkStream не переопределяет поведение ReadAsync по умолчанию, токен игнорируется (см. NetworkStream.ReadAsync with a cancellation token never cancels).
Я попытался закрыть базовый поток, и это вызывает ожидающий вызов ReadAsync для вызова ObjectDisposedException, а базовое соединение Bluetooth также закрывается. В идеале я не хочу полностью разорвать соединение с устройством, чтобы прекратить чтение. Это не похоже на чистый способ сделать это, и вам не нужно разрушать весь поток, чтобы прервать вызов ReadAsync().
Любые советы?
я забыл о проверке DataAvailable! Спасибо за образец кода и за ссылку на статью Стивена Тууба. Оба будут полезны для меня, чтобы добиться того, что я после. Благодаря! – Swampie