private async void StartTraceRteBtn_Click(object sender, RoutedEventArgs e) { var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); hostsLookedUp = 0; traceView.ItemsSource = null; traceView.IsReadOnly = true; fakeProgressBar.Visibility = Visibility.Visible; startTraceRteBtn.Visibility = Visibility.Hidden; var currentPing = $"Current Ping: {(await pinger.GetSingleRoundTrip(IPAddress.Parse(host.IP), 64)).RoundTrip}ms"; Logger.Info(currentPing); pingTimeLabel.Content = currentPing; TraceReplies.Clear(); traceView.ItemsSource = TraceReplies; try { await RunTraceRoute(); } catch (Exception) { Logger.Error("RunTraceRoute Cancelled"); return; } Task allLookedUp = Task.WhenAll(HostNameLookupTasks); try { allLookedUp.Wait(); } catch { } while (TraceReplies.Count != hostsLookedUp) { if (stopWatch.Elapsed == TimeSpan.FromMinutes(5)) { break; } try { await Task.Delay(50, cancelToken.Token); // Keep waiting for the all of the hosts to get looked up. Use Task.Delay to prevent UI lockups. } catch { break; } } fakeProgressBar.Visibility = Visibility.Hidden; CheckButtons(); startTraceRteBtn.Visibility = Visibility.Visible; traceView.IsReadOnly = false; stopWatch.Stop(); Logger.Info($"Total trace route time {stopWatch.ElapsedMilliseconds}ms"); }