Javascript 即使UnsumedBufferLength为0,也正在完成DataReader.loadAsync

Javascript 即使UnsumedBufferLength为0,也正在完成DataReader.loadAsync,javascript,typescript,windows-runtime,Javascript,Typescript,Windows Runtime,我使用以下代码在UWP WinRT上使用JSON流: async function connect() { let stream: MSStream; return new CancellableContext<void>( async (context) => { // this will be called immediately stream = await context.queue(()

我使用以下代码在UWP WinRT上使用JSON流:

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();
}
异步函数connect(){ 让流:MSStream; 返回新的CancelableContext( 异步(上下文)=>{ //这将立即被调用 stream=wait context.queue(()=>getStreamByXHR());//返回ms stream对象 等待消费流(流); }, { 回复:()=>{ //当用户取消任务时,将调用此函数 stream.msClose(); } } ).feed(); } 异步函数consumerstream(流:MSStream){ 返回新的CancelableContext(异步(上下文)=>{ const input=stream.msDetachStream()作为Windows.Storage.Streams.IInputStream; const reader=new Windows.Storage.Streams.DataReader(输入); reader.inputStreamOptions=Windows.Storage.Streams.inputStreamOptions.partial; 而(!context.cancelled){ 常量内容=等待消费字符串(1000); //…更多的代码 } 异步函数consumerString(计数:number){ wait reader.loadAsync(count);//将在流关闭时抛出 返回reader.readString(reader.unsumedbufferlength); } }).feed(); } 在这里,关于的文件说:

当一个或多个字节可用时,异步读取操作完成

但是,
reader.loadAsync
即使在
reader.unsumedbufferlength
为0时也会完成,这会导致CPU负载增加。这是一个API错误还是我可以防止这种行为,以便只有当
unsumedbufferlength
大于0时,
loadAsync
才能完成

PS:这里是纯JS的复制:

这是一个API错误还是我可以阻止这种行为,以便loadAsync只能在UnsumedBufferLength大于0时完成

最有可能的是,它也在流的末尾完成。因此,在这种情况下,
未使用的bufferlength
将为零,需要满足

事实上,at的示例显示了类似的情况(承认没有使用该选项):


啊,当流断开连接时,这里的
cancelled
变量将为真,因此在这种情况下不会调用
loadAsync
。@KagamiSaschaRosylight显示已取消变量的逻辑好的,我添加了更多行
loadAsync
只会对断开连接的流抛出一个错误,无论如何:
WinrError:对象已关闭。
我可以确认断开连接后从未调用
loadAsync
            // Once we have written the contents successfully we load the stream.
            await dataReader.LoadAsync((uint)stream.Size);

            var receivedStrings = "";

            // Keep reading until we consume the complete stream.
            while (dataReader.UnconsumedBufferLength > 0)