Example #1
0
        /// <summary>Write client messages.</summary>
        /// <param name="webSocket">  The web socket.</param>
        /// <param name="clientGuid"> Unique identifier for the client.</param>
        /// <param name="cancelToken">A token that allows processing to be canceled.</param>
        /// <returns>An asynchronous result.</returns>
        private async Task WriteClientMessages(
            WebSocket webSocket,
            Guid clientGuid,
            CancellationToken cancelToken)
        {
            // get the client object
            if (!WebsocketManager.TryGetClient(clientGuid, out WebsocketClientInformation client))
            {
                // nothing to do here (will cancel on exit)
                return;
            }

            // loop until cancelled
            while (!cancelToken.IsCancellationRequested)
            {
                // do not bubble errors here
                try
                {
                    // **** check for a message ***
                    if (!client.MessageQ.TryDequeue(out string message))
                    {
                        // wait and prevent exceptions
                        await Task.Delay(_sendSleepDelayMs, cancelToken)
                        .ContinueWith(_ => Task.CompletedTask);

                        // go to next loop
                        continue;
                    }

                    // grab a byte buffer of our data
                    byte[] buffer = Encoding.UTF8.GetBytes(message);

                    // send this message
                    await webSocket.SendAsync(
                        buffer,
                        WebSocketMessageType.Text,
                        true,
                        cancelToken).ConfigureAwait(false);

                    WebsocketManager.UpdateTimeoutForSentMessage(clientGuid);
                }

                // keep looping
                catch (Exception ex)
                {
                    Console.WriteLine($"SubscriptionWebsocketHandler.WriteClientMessages" +
                                      $" <<< client: {clientGuid} caught exception: {ex.Message}");

                    // this socket is borked, exit
                    break;
                }
            }
        }