場合でも、私はこのコードでUWP WinRTの上JSONストリームを消費しています完了している:DataReader.loadAsyncがunconsumedBufferLengthが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();
}
、ドキュメントを約InputStreamOptions.partial
言う:しかし
The asynchronous read operation completes when one or more bytes is available.
reader.unconsumedBufferLength
が0であってもCPU負荷が発生してもreader.loadAsync
が完了します。これはAPIのバグですか?が0より大きい場合にのみloadAsync
が完了できるようにこの動作を防止できますか?
PS:ここでは、純粋なJSとREPROです:https://github.com/SaschaNaz/InputStreamOptionsBugRepro
ああストリームはloadAsync 'ように、切断されたときに、ここでは' canceled'変数がtrueになります'その場合は呼び出されません。 –
@ KagamiSaschaRosylightキャンセルされた変数のロジックを表示 – basarat
さて、私はもっと多くの行を追加しました。 'loadAsync'は、切断されたストリームでエラーを送出します。' WinRTError:オブジェクトが閉じられました.''切断後に 'loadAsync'が呼び出されないことを確認できます。 –