Пример #1
0
 protected override Task <Stream> CreateContentReadStreamAsync()
 {
     // WriteMessageAsync might run synchronously and try to write to the stream. ProducerConsumerStream
     // will block on the write until the stream is being read from. The WriteMessageAsync method needs
     // to run on a different thread to prevent a deadlock.
     _stream       = new ProducerConsumerStream();
     _encodingTask = Task.Run(async() => await _messageEncoder.WriteMessageAsync(_message, _stream));
     return(Task.FromResult(_stream));
 }
Пример #2
0
        protected override Task <Stream> CreateContentReadStreamAsync()
        {
            // WriteMessageAsync might run synchronously and try to write to the stream. ProducerConsumerStream
            // will block on the write until the stream is being read from. The WriteMessageAsync method needs
            // to run on a different thread to prevent a deadlock.
            var resultStream = new ProducerConsumerStream();

            _stream = new BufferedWriteStream(resultStream, WriteBufferSize);
            Task.Factory.StartNew(async(content) =>
            {
                var thisPtr = content as StreamedMessageContent;
                try
                {
                    await _messageEncoder.WriteMessageAsync(thisPtr._message, thisPtr._stream);
                }
                finally
                {
                    thisPtr._stream.Dispose();
                    thisPtr._writeCompletedTcs.TrySetResult(true);
                }
            }, this, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

            return(Task.FromResult <Stream>(resultStream));
        }