javascript - DataReader.loadAsync fullføres selv når unconsumedBufferLength er 0


Jeg konsumerer JSON-strøm på UWP WinRT med denne koden:

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();
}

Her sier dokumentet om InputStreamOptions.partial:

Den asynkrone leseoperasjonen fullføres når en eller flere byte er tilgjengelige.

Men, reader.loadAsync fullføres selv når reader.unconsumedBufferLength er 0, og dette gir CPU-belastning. Er dette en API-feil, eller kan jeg forhindre denne oppførselen slik at loadAsync bare fullføres når unconsumedBufferLength er større enn 0?

PS: Her er et repro med ren JS: https://github.com/SaschaNaz/InputStreamOptionsBugRepro

Svar #1

Er dette en API-feil, eller kan jeg forhindre denne oppførselen slik at loadAsync kun fullføres når unconsumedBufferLength er større enn 0

Most sannsynlig fullføres det også på end of stream. Så i så fall vil unconsumedBufferLength være null og må tas i betraktning.

Faktisk viser eksemplet på https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.streams.datareader.aspx noe lignende (om enn ikke ved å bruke det alternativet):

            // 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)

🌹

Relaterte artikler