Как отменить NetworkStream.ReadAsync без закрытия потока

Я пытаюсь использовать 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 также закрывается. В идеале я не хочу полностью разорвать соединение с устройством, чтобы просто перестать читать. Это не кажется чистым способом сделать это, и нет необходимости разрывать весь поток, просто чтобы прервать вызов ReadAsync ().

Любой совет?

Ответы на вопрос(3)

Ваш ответ на вопрос