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