Tôi đang tiêu thụ dòng JSON trên UWP WinRT với mã này:DataReader.loadAsync đang được hoàn thành ngay cả khi unconsumedBufferLength là 0
async function connect() {
let stream: MSStream;
return new CancellableContext<void>(
async (context) => {
// this will be called immediately
stream = await context.queue(() => getStreamByXHR()); // returns ms-stream object
await consumeStream(stream);
},
{
revert:() => {
// this will be called when user cancels the task
stream.msClose();
}
}
).feed();
}
async function consumeStream(stream: MSStream) {
return new CancellableContext<void>(async (context) => {
const input = stream.msDetachStream() as Windows.Storage.Streams.IInputStream;
const reader = new Windows.Storage.Streams.DataReader(input);
reader.inputStreamOptions = Windows.Storage.Streams.InputStreamOptions.partial;
while (!context.canceled) {
const content = await consumeString(1000);
// ... some more codes
}
async function consumeString(count: number) {
await reader.loadAsync(count); // will throw when the stream gets closed
return reader.readString(reader.unconsumedBufferLength);
}
}).feed();
}
Ở đây, tài liệu về InputStreamOptions.partial
nói:
The asynchronous read operation completes when one or more bytes is available.
Tuy nhiên , reader.loadAsync
hoàn thành ngay cả khi reader.unconsumedBufferLength
bằng 0 và điều này làm cho tải CPU. Đây có phải là lỗi API hay không Tôi có thể ngăn chặn hành vi này để loadAsync
chỉ có thể hoàn thành khi unconsumedBufferLength
lớn hơn 0 không?
PS: Đây là một repro với JS tinh khiết: https://github.com/SaschaNaz/InputStreamOptionsBugRepro
Ah, biến 'canceled' đây sẽ đúng khi dòng bị ngắt kết nối để 'loadAsync 'sẽ không được gọi trong trường hợp đó. –
@KagamiSaschaRosylight hiển thị logic cho biến bị hủy – basarat
Được rồi, tôi đã thêm nhiều dòng hơn. 'loadAsync' sẽ chỉ ném một lỗi với luồng đã ngắt kết nối, dù sao:' WinRTError: Đối tượng đã bị đóng .' Tôi có thể xác nhận rằng 'loadAsync' không bao giờ được gọi sau khi ngắt kết nối. –