Example #1
0
        private async void StartPingLoop()
        {
            await Task.Delay(pingDelayMs);

            while (!isClosed)
            {
                try
                {
                    var pingRequest  = new PingRequest();
                    var pingSendTask = Send(pingRequest).ContinueWith(t => { var ignored = t.Exception; }, TaskContinuationOptions.OnlyOnFaulted);

                    var pingTimeoutTask = Task.Delay(pingTimeoutMs);
                    if (await Task.WhenAny(pingTimeoutTask, pingSendTask) == pingTimeoutTask)
                    {
                        Debug.WriteLine($"Ping timed-out({pingTimeoutMs / 1000}s). Closing connection.");
                        transport.Dispose(); //  kill connection so that Listening thread could finish and break connection

                        break;
                    }

                    await Task.Delay(pingDelayMs);
                }
                catch (Exception ex)
                {
                    if (!isClosed)
                    {
                        Debug.WriteLine($"Exception on Ping: {ex.Message}. Closing connection.");
                        transport.Dispose(); //  kill connection so that Listening thread could finish and break connection

                        break;
                    }
                }
            }
        }