Javascript 即使UnsumedBufferLength为0,也正在完成DataReader.loadAsync
我使用以下代码在UWP WinRT上使用JSON流: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(()
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)