Tôi đang cố sử dụng NetworkStream.ReadAsync() để đọc dữ liệu nhưng tôi không thể tìm cách hủy bỏ ReadAsync() một lần được gọi. Đối với nền, NetworkStream được cung cấp cho tôi bởi một đối tượng BluetoothClient được kết nối (từ Thư viện Bluetooth 32Feet.NET).Cách hủy NetworkStream.ReadAsync mà không đóng luồng
Mã làm việc hiện tại tôi đang cố gắng ở bên dưới.
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");
Mã này hoạt động dữ liệu nhận tốt, và sẽ ngừng lặp nếu cờ continueReading được thiết lập là false và dữ liệu được nhận, nhưng cho đến khi nhận được dữ liệu nó sẽ không tiến hành quá khứ dòng ReadAsync(). Tôi không thể xem cách hủy cuộc gọi mà không nhận dữ liệu.
Tôi biết rằng có quá tải ReadAsync cung cấp CancellationToken, nhưng có vẻ như NetworkStream không ghi đè hành vi ReadAsync mặc định, mã thông báo bị bỏ qua (xem NetworkStream.ReadAsync with a cancellation token never cancels).
Tôi đã thử đóng luồng cơ bản và điều này làm cho cuộc gọi chờ đợi của ReadAsync ném ObjectDisposedException và kết nối Bluetooth bên dưới cũng bị đóng. Lý tưởng nhất là tôi không muốn cắt đứt hoàn toàn kết nối với thiết bị chỉ để dừng đọc. Nó không có vẻ là một cách sạch sẽ để làm điều đó, và cảm thấy không cần thiết để phá vỡ toàn bộ dòng chỉ để làm gián đoạn va ReadAsync() gọi.
Bạn có lời khuyên nào không?
tôi muốn quên về việc kiểm tra DataAvailable! Cảm ơn bạn đã gửi mã mẫu và liên kết tới bài viết của Stephen Toub. Cả hai sẽ rất hữu ích cho tôi để đạt được điều đó tôi sau. Cảm ơn! – Swampie