Пример #1
0
 protected override void Dispose(bool disposing)
 {
     if (disposing && !closedCancelSource.IsCancellationRequested)
     {
         writeBuffer.CloseWrite();
         readBuffer.CloseRead();
         try {
             Task.WhenAll(writeTask, readTask).Wait();
         }
         catch (AggregateException) {
         }
         closedCancelSource.Cancel();
         if (WriteStream != null)
         {
             WriteStream.Close();
         }
         if (ReadStream != null)
         {
             ReadStream.Close();
         }
         closedCancelSource.Dispose();
     }
     base.Dispose(disposing);
 }
Пример #2
0
        private async Task ProcessRead(Stream s)
        {
            readBuffer.WriteTimeout = Timeout.Infinite;
            var buf          = new byte[64 * 1024];
            var ct           = closedCancelSource.Token;
            var canceledTask = new TaskCompletionSource <int>();

            try {
                using (ct.Register(() => canceledTask.SetCanceled())) {
                    var completed = await Task.WhenAny(s.ReadAsync(buf, 0, buf.Length, ct), canceledTask.Task).ConfigureAwait(false);

                    var len = await completed.ConfigureAwait(false);

                    while (len > 0)
                    {
                        await readBuffer.WriteAsync(buf, 0, len, ct).ConfigureAwait(false);

                        completed = await Task.WhenAny(s.ReadAsync(buf, 0, buf.Length, ct), canceledTask.Task).ConfigureAwait(false);

                        len = await completed.ConfigureAwait(false);
                    }
                }
                socket.Shutdown(SocketShutdown.Receive);
            }
            catch (OperationCanceledException) {
                socket.Shutdown(SocketShutdown.Receive);
            }
            catch (IOException) {
                if (!ct.IsCancellationRequested)
                {
                    throw;
                }
            }
            catch (ObjectDisposedException) {
                if (!ct.IsCancellationRequested)
                {
                    throw;
                }
            }
            finally {
                readBuffer.CloseWrite();
            }
        }