2016-02-20 10 views
6

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

Antwort

1

Is this an API bug or can I prevent this behavior so that loadAsync can complete only when unconsumedBufferLength is greater than 0

meisten likey es vervollständigt auch am Ende des Streams. In diesem Fall ist unconsumedBufferLength Null und muss berücksichtigt werden.

In der Tat das Beispiel bei https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.streams.datareader.aspx zeigt etwas ähnliches (zugegebenermaßen nicht diese Option):

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

+0

Ah, die 'canceled' Variable wird hier wahr sein, wenn der Strom so getrennt wird' LoadAsync 'wird in diesem Fall nicht aufgerufen. –

+0

@KagamiSaschaRosylight zeigt die Logik für die abgebrochene Variable – basarat

+0

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. –

Verwandte Themen