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