private async Task RunTraceRoute() { var result = new List <TraceReply>(); string data = Pinger.RandomString(host.PacketSize); Logger.Debug($"Data string: {data}"); byte[] buffer = Encoding.ASCII.GetBytes(data); using var ping = new Ping(); for (int ttl = 1; ttl <= 128; ttl++) { var pingOpts = new PingOptions(ttl, true); var reply = await ping.SendPingAsync(host.HostName, host.Timeout, buffer, pingOpts); if (reply.Status == IPStatus.Success || reply.Status == IPStatus.TtlExpired) { var newID = Guid.NewGuid(); TraceReplies.Add(new TraceReply { ID = newID, IPAddress = reply.Address.ToString(), PingTimes = new string[3], Ttl = ttl, HostName = "Looking up host...", IPAddButtonVisible = Visibility.Hidden, HostAddButtonVisible = Visibility.Hidden }); traceView.ScrollIntoView(TraceReplies.Last()); HostNameLookupTasks.Add(Task.Run(() => { Dns.GetHostEntryAsync(reply.Address).ContinueWith(hostEntryTask => { Logger.Debug($"Starting lookup for address {reply.Address} with ID {newID}"); try { TraceReplies.First(t => t.ID == newID).HostName = hostEntryTask.Result.HostName; } catch (Exception ex) { Logger.Debug($"Unable to find host entry for IP {reply.Address}"); Logger.Log.Debug(ex, $"Exception data for {reply.Address} with Ttl {ttl} and ID of {newID}"); TraceReplies.First(t => t.ID == newID).HostName = "N/A"; } Interlocked.Increment(ref hostsLookedUp); Logger.Debug($"hostsLookedUp: {hostsLookedUp}"); syncCtx.Post(new SendOrPostCallback(o => { traceView.Items.Refresh(); }), null); }, cancelToken.Token); }, cancelToken.Token)); var firstTry = await pinger.GetSingleRoundTrip(reply.Address, ttl + 1); TraceReplies.First(t => t.ID == newID).PingTimes[0] = firstTry.Status != IPStatus.Success ? firstTry.Status.ToString() : firstTry.RoundTrip.ToString() + "ms"; traceView.Items.Refresh(); if (firstTry.Item2 == IPStatus.Success) { await Task.Delay(250, cancelToken.Token); } var secondTry = await pinger.GetSingleRoundTrip(reply.Address, ttl + 1); TraceReplies.First(t => t.ID == newID).PingTimes[1] = secondTry.Status != IPStatus.Success ? secondTry.Status.ToString() : secondTry.RoundTrip.ToString() + "ms"; traceView.Items.Refresh(); if (secondTry.Item2 == IPStatus.Success) { await Task.Delay(250, cancelToken.Token); } var thirdTry = await pinger.GetSingleRoundTrip(reply.Address, ttl + 1); TraceReplies.First(t => t.ID == newID).PingTimes[2] = thirdTry.Status != IPStatus.Success ? thirdTry.Status.ToString() : thirdTry.RoundTrip.ToString() + "ms"; traceView.Items.Refresh(); if (thirdTry.Item2 == IPStatus.Success) { await Task.Delay(250, cancelToken.Token); } } if (reply.Status != IPStatus.TtlExpired && reply.Status != IPStatus.TimedOut) { break; } } }