ich JSON-Stream bin raubend auf UWP WinRT mit diesem Code:DataReader.loadAsync noch nicht abgeschlossen ist, wenn unconsumedBufferLength 0 ist
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();
}
Hier wird das Dokument über InputStreamOptions.partial
sagt:
The asynchronous read operation completes when one or more bytes is available.
jedoch , reader.loadAsync
wird abgeschlossen, auch wenn reader.unconsumedBufferLength
0 ist und dies die CPU belastet. Ist dies ein API-Fehler oder kann ich dieses Verhalten verhindern, sodass loadAsync
nur abgeschlossen werden kann, wenn unconsumedBufferLength
größer als 0 ist?
PS: ist hier ein Repro mit reinem JS: https://github.com/SaschaNaz/InputStreamOptionsBugRepro
Ah, die 'canceled' Variable wird hier wahr sein, wenn der Strom so getrennt wird' LoadAsync 'wird in diesem Fall nicht aufgerufen. –
@KagamiSaschaRosylight zeigt die Logik für die abgebrochene Variable – basarat
Okay, ich habe mehr Zeilen hinzugefügt. 'loadAsync' erzeugt nur einen Fehler mit einem nicht verbundenen Stream:' WinRTError: Das Objekt wurde geschlossen. 'Ich kann bestätigen, dass 'loadAsync' niemals nach dem Trennen aufgerufen wird. –