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;
}