private void ProcessConcreteCompletedOperation(IAsyncOperationWithProgress <IBuffer, uint> completedOperation, out long bytesCompleted) { IBuffer resultBuffer = completedOperation.GetResults(); Debug.Assert(resultBuffer != null); WinRtIOHelper.EnsureResultsInUserBuffer(_userBuffer, resultBuffer); bytesCompleted = _userBuffer.Length; }
// Moved it to the end while using Dev10 VS because it does not understand async and everything that follows looses intellisense. // Should move this code into the Reading regios once using Dev11 VS becomes the norm. private async Task <Int32> ReadAsyncInternal(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken) { Debug.Assert(buffer != null); Debug.Assert(offset >= 0); Debug.Assert(count >= 0); Debug.Assert(buffer.Length - offset >= count); Debug.Assert(_canRead); IInputStream wrtStr = EnsureNotDisposed <IInputStream>(); #if DEBUG AssertValidStream(wrtStr); #endif // DEBUG try { IBuffer userBuffer = buffer.AsBuffer(offset, count); IAsyncOperationWithProgress <IBuffer, UInt32> asyncReadOperation = wrtStr.ReadAsync(userBuffer, unchecked ((UInt32)count), InputStreamOptions.Partial); IBuffer resultBuffer = await asyncReadOperation.AsTask(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); // If cancellationToken was cancelled until now, then we are currently propagating the corresponding cancellation exception. // (It will be correctly rethrown by the catch block below and overall we will return a cancelled task.) // But if the underlying operation managed to complete before it was cancelled, we want // the entire task to complete as well. This is ok as the continuation is very lightweight: if (resultBuffer == null) { return(0); } WinRtIOHelper.EnsureResultsInUserBuffer(userBuffer, resultBuffer); Debug.Assert(resultBuffer.Length <= unchecked ((UInt32)Int32.MaxValue)); return((Int32)resultBuffer.Length); } catch (Exception ex) { // If the interop layer gave us an Exception, we assume that it hit a general/unknown case and wrap it into // an IOException as this is what Stream users expect. WinRtIOHelper.NativeExceptionToIOExceptionInfo(ex).Throw(); return(0); } }