public async Task <bool> Disconnect(TimeSpan timeout) { var connectionStream = await StreamManager.Get(0).ConfigureAwait(false); var semaphoreWait = new SemaphoreSlim(0); var cancelTokenSource = new CancellationTokenSource(); var sentGoAway = false; var sentDelegate = new Http2Stream.FrameSentDelegate(frame => { if (frame.Type == FrameType.GoAway) { sentGoAway = true; semaphoreWait.Release(); } }); connectionStream.OnFrameSent += sentDelegate; await connection.QueueFrame(new GoAwayFrame()).ConfigureAwait(false); if (timeout != Timeout.InfiniteTimeSpan) { cancelTokenSource.CancelAfter(timeout); } await semaphoreWait.WaitAsync(cancelTokenSource.Token).ConfigureAwait(false); connectionStream.OnFrameSent -= sentDelegate; connection.Disconnect(); return(sentGoAway); }
private bool _Disconnect(TimeSpan?timeout) { var connectionStream = streamManager.Get(0); var semaphoreWait = new Semaphore(0, 100); var sentGoAway = false; var sentDelegate = new Http2Stream.FrameSentDelegate(frame => { if (frame.Type == FrameType.GoAway) { sentGoAway = true; semaphoreWait.Release(); } }); connectionStream.OnFrameSent += sentDelegate; connection.QueueFrame(new GoAwayFrame()); if (timeout.HasValue) { semaphoreWait.WaitOne((int)timeout.Value.TotalMilliseconds); } else { semaphoreWait.WaitOne(); } connectionStream.OnFrameSent -= sentDelegate; connection.Disconnect(); return(sentGoAway); }
public async Task<bool> Disconnect (TimeSpan timeout) { var connectionStream = await streamManager.Get (0); var semaphoreWait = new SemaphoreSlim (0); var cancelTokenSource = new CancellationTokenSource (); var sentGoAway = false; var sentDelegate = new Http2Stream.FrameSentDelegate (frame => { if (frame.Type == FrameType.GoAway) { sentGoAway = true; semaphoreWait.Release (); } }); connectionStream.OnFrameSent += sentDelegate; connection.QueueFrame (new GoAwayFrame ()); if (timeout != Timeout.InfiniteTimeSpan) cancelTokenSource.CancelAfter (timeout); await semaphoreWait.WaitAsync (cancelTokenSource.Token); connectionStream.OnFrameSent -= sentDelegate; connection.Disconnect (); return sentGoAway; }