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(); } }
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(); } }
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(); }
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(); }
private static async Task FlushAsyncAwaited(ValueAwaiter <FlushResult> awaitable) { await awaitable; }
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()); }
protected override bool BeginRead(out ValueAwaiter <ReadResult> awaitable) { awaitable = Input.ReadAsync(); return(true); }