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