Я пытаюсь использовать NetworkStream.ReadAsync() для чтения данных, но я не могу найти, как отменить вызов ReadAsync(). Для фона NetworkStream предоставляется мне связанным объектом BluetoothClient (из библиотеки 32Feet.NET Bluetooth).
Текущий код get-it-working, который я пытаюсь, ниже.
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 установлен в false и данные получены, но пока данные не будут получены, он не будет проходить через строку ReadAsync(). Я не вижу, как отменить вызов без получения данных.
Я знаю, что существует перегрузка ReadAsync, которая предоставляет CancellationToken, но похоже, что поскольку NetworkStream не переопределяет поведение по умолчанию ReadAsync, токен игнорируется (см. NetworkStream.ReadAsync с маркером отмены никогда не отменяет).
Я попытался закрыть базовый поток, и это вызывает ожидающий вызов ReadAsync для вызова ObjectDisposedException, а базовое соединение Bluetooth также закрывается. В идеале я не хочу полностью разорвать соединение с устройством, чтобы прекратить чтение. Это не похоже на чистый способ сделать это, и вам не нужно разрывать весь поток, чтобы прервать вызов ReadAsync().
Любые советы?