Jak anulować NetworkStream.ReadAsync bez zamykania strumienia

Próbuję użyć NetworkStream.ReadAsync () do odczytu danych, ale nie mogę znaleźć sposobu, aby anulować wywołanie ReadAsync (). Dla tła NetworkStream jest dostarczany do mnie przez podłączony obiekt BluetoothClient (z 32Feet.NET Bluetooth Library).

Aktualny kod, który próbuję uzyskać, jest poniżej.

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");

Kod działa poprawnie, odbierając dane i przestanie zapętlać, jeśli flaga continueReading jest ustawiona na false, a dane są odbierane, ale dopóki dane nie zostaną odebrane, nie przejdzie dalej przez linię ReadAsync (). Nie widzę, jak przerwać połączenie bez odbierania danych.

Wiem, że istnieje przeciążenie ReadAsync, które zapewnia CancellationToken, ale wydaje się, że ponieważ NetworkStream nie zastępuje domyślnego zachowania ReadAsync, token jest ignorowany (patrzNetworkStream.ReadAsync z tokenem anulowania nigdy nie anuluje).

Próbowałem zamknąć strumień bazowy, a to powoduje oczekiwanie na wywołanie ReadAsync do rzucenia ObjectDisposedException, a podstawowe połączenie Bluetooth zostaje również zamknięte. Idealnie nie chcę całkowicie zerwać połączenia z urządzeniem tylko po to, by przestać czytać. Wydaje się, że nie jest to czysty sposób i czuje się niepotrzebnie zburzyć cały strumień, aby przerwać wywołanie funkcji ReadAsync ().

Jakakolwiek rada?

questionAnswers(3)

yourAnswerToTheQuestion