public override Task<WebSocketReceiveResult> ReceiveAsync(ArraySegment<byte> buffer, CancellationToken cancellationToken)
{
WebSocketValidate.ValidateArraySegment(buffer, nameof(buffer));
try
{
ClientWebSocket.ThrowIfInvalidState(_state, _disposed, s_validReceiveStates);
Debug.Assert(!Monitor.IsEntered(StateUpdateLock), $"{nameof(StateUpdateLock)} must never be held when acquiring {nameof(ReceiveAsyncLock)}");
lock (ReceiveAsyncLock) // synchronize with receives in CloseAsync
{
ThrowIfOperationInProgress(_lastReceiveAsync);
Task<WebSocketReceiveResult> t = ReceiveAsyncPrivate(buffer, cancellationToken);
_lastReceiveAsync = t;
return t;
}
}
catch (Exception exc)
{
return Task.FromException<WebSocketReceiveResult>(exc);
}
}