Пример #1
0
        private async Task ApplyBackpressureAsync(ValueAwaiter <FlushResult> flushTask)
        {
            Log.ConnectionPause(ConnectionId);
            _socket.ReadStop();

            var result = await flushTask;

            // If the reader isn't complete or cancelled then resume reading
            if (!result.IsCompleted && !result.IsCancelled)
            {
                Log.ConnectionResume(ConnectionId);
                StartReading();
            }
        }
Пример #2
0
        private static async Task Continue(ValueAwaiter <FlushResult> awaitable, ReadOperation operation)
        {
            // Keep reading once we get the completion
            var flushResult = await awaitable;

            if (!flushResult.IsCompleted)
            {
                operation.Read();
            }
            else
            {
                operation.Writer.Complete();

                operation.Dispose();
            }
        }
Пример #3
0
        public void Ctor_AlreadyCompletedInput(ValueAwaiter <string> va)
        {
            Assert.True(va.IsCompleted);
            Assert.Equal("hello", va.GetResult());

            int threadId = Environment.CurrentManagedThreadId;
            var are      = new AutoResetEvent(false);

            va.OnCompleted(() =>
            {
                Assert.NotEqual(threadId, Environment.CurrentManagedThreadId);
                are.Set();
            });
            are.WaitOne();

            va.UnsafeOnCompleted(() =>
            {
                Assert.NotEqual(threadId, Environment.CurrentManagedThreadId);
                are.Set();
            });
            are.WaitOne();
        }
Пример #4
0
        private async Task FlushAsyncAwaited(ValueAwaiter <FlushResult> awaitable, long count, CancellationToken cancellationToken)
        {
            // https://github.com/dotnet/corefxlab/issues/1334
            // Since the flush awaitable doesn't currently support multiple awaiters
            // we need to use a task to track the callbacks.
            // All awaiters get the same task
            lock (_flushLock)
            {
                if (_flushTcs == null || _flushTcs.Task.IsCompleted)
                {
                    _flushTcs = new TaskCompletionSource <object>();

                    awaitable.OnCompleted(_flushCompleted);
                }
            }

            _timeoutControl.StartTimingWrite(count);
            await _flushTcs.Task;

            _timeoutControl.StopTimingWrite();

            cancellationToken.ThrowIfCancellationRequested();
        }
Пример #5
0
 private static async Task FlushAsyncAwaited(ValueAwaiter <FlushResult> awaitable)
 {
     await awaitable;
 }
Пример #6
0
        public void Ctor_NotYetCompleted(int completionMode, TaskCompletionSource <int> tcs, ValueAwaiter <int> va)
        {
            Assert.False(tcs.Task.IsCompleted);
            Assert.False(va.IsCompleted);

            var    are    = new AutoResetEvent(false);
            Action action = () => are.Set();

            switch (completionMode)
            {
            case 0: va.OnCompleted(action); break;

            case 1: va.UnsafeOnCompleted(action); break;
            }

            tcs.SetResult(42);
            are.WaitOne();

            Assert.True(va.IsCompleted);
            Assert.Equal(42, va.GetResult());
        }
Пример #7
0
 protected override bool BeginRead(out ValueAwaiter <ReadResult> awaitable)
 {
     awaitable = Input.ReadAsync();
     return(true);
 }