protected Task StartProcessingMessages()

in src/Azure.AppService.Tunnel/Tunnel/Sockets/SocketConnection.cs [33:71]


    protected Task StartProcessingMessages()
    {
        return Task.Factory.StartNew(() =>
        {
            _logger.Info("Begin processing messages");

            var receiveBuffer = new byte[16384];

            var socket = Socket.Value;

            while (socket.Connected && _lifetime.IsAlive)
            {
                try
                {
                    var receivedBytes = socket.Receive(receiveBuffer);

                    if (receivedBytes > 0)
                        _dataReceived.Fire(receiveBuffer.Take(receivedBytes).ToArray());
                }
                catch (Exception e)
                {
                    switch (e)
                    {
                        case SocketException { SocketErrorCode: SocketError.TimedOut or SocketError.WouldBlock }:
                            continue;

                        case SocketException:
                        case ObjectDisposedException:
                            _logger.Verbose($"Exception during Receive: {e.GetType().Name} {e.Message}");
                            break;

                        default:
                            _logger.Error(e);
                            throw;
                    }
                }
            }
        }, _lifetime, TaskCreationOptions.LongRunning, TaskScheduler.Default);
    }