System.Net.WebSockets.WebSocketBase.StartOnCloseCompleted C# (CSharp) Method

StartOnCloseCompleted() private method

private StartOnCloseCompleted ( bool thisLockTakenSnapshot, bool sessionHandleLockTakenSnapshot, CancellationToken cancellationToken ) : Task
thisLockTakenSnapshot bool
sessionHandleLockTakenSnapshot bool
cancellationToken System.Threading.CancellationToken
return Task
        private async Task<bool> StartOnCloseCompleted(bool thisLockTakenSnapshot,
            bool sessionHandleLockTakenSnapshot,
            CancellationToken cancellationToken)
        {
            Debug.Assert(thisLockTakenSnapshot, "'thisLockTakenSnapshot' MUST be 'true' at this point.");

            if (IsStateTerminal(_state))
            {
                return false;
            }

            _state = WebSocketState.Closed;

            if (_innerStreamAsWebSocketStream != null)
            {
                bool thisLockTaken = thisLockTakenSnapshot;
                bool sessionHandleLockTaken = sessionHandleLockTakenSnapshot;

                try
                {
                    if (_closeNetworkConnectionTask == null)
                    {
                        _closeNetworkConnectionTask =
                            _innerStreamAsWebSocketStream.CloseNetworkConnectionAsync(cancellationToken);
                    }

                    if (thisLockTaken && sessionHandleLockTaken)
                    {
                        ReleaseLocks(ref thisLockTaken, ref sessionHandleLockTaken);
                    }
                    else if (thisLockTaken)
                    {
                        ReleaseLock(_thisLock, ref thisLockTaken);
                    }

                    await _closeNetworkConnectionTask.SuppressContextFlow();
                }
                catch (Exception closeNetworkConnectionTaskException)
                {
                    if (!CanHandleExceptionDuringClose(closeNetworkConnectionTaskException))
                    {
                        ThrowIfConvertibleException(nameof(StartOnCloseCompleted),
                            closeNetworkConnectionTaskException,
                            cancellationToken,
                            cancellationToken.IsCancellationRequested);
                        throw;
                    }
                }
            }

            return true;
        }