2016-02-20 11 views
6

Tôi đang tiêu thụ dòng JSON trên UWP WinRT với mã này:DataReader.loadAsync đang được hoàn thành ngay cả khi unconsumedBufferLength là 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(); 
} 

Ở đây, tài liệu về InputStreamOptions.partial nói:

The asynchronous read operation completes when one or more bytes is available.

Tuy nhiên , reader.loadAsync hoàn thành ngay cả khi reader.unconsumedBufferLength bằng 0 và điều này làm cho tải CPU. Đây có phải là lỗi API hay không Tôi có thể ngăn chặn hành vi này để loadAsync chỉ có thể hoàn thành khi unconsumedBufferLength lớn hơn 0 không?

PS: Đây là một repro với JS tinh khiết: https://github.com/SaschaNaz/InputStreamOptionsBugRepro

Trả lời

1

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

Hầu hết likey nó cũng hoàn thành tại cuối dòng. Vì vậy, trong trường hợp đó, unconsumedBufferLength sẽ bằng 0 và cần được phục vụ.

Trong thực tế, ví dụ tại https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.streams.datareader.aspx cho thấy một cái gì đó tương tự (phải thừa nhận là không sử dụng tùy chọn):

  // 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, biến 'canceled' đây sẽ đúng khi dòng bị ngắt kết nối để 'loadAsync 'sẽ không được gọi trong trường hợp đó. –

+0

@KagamiSaschaRosylight hiển thị logic cho biến bị hủy – basarat

+0

Được rồi, tôi đã thêm nhiều dòng hơn. 'loadAsync' sẽ chỉ ném một lỗi với luồng đã ngắt kết nối, dù sao:' WinRTError: Đối tượng đã bị đóng .' Tôi có thể xác nhận rằng 'loadAsync' không bao giờ được gọi sau khi ngắt kết nối. –

Các vấn đề liên quan