public void TraceAsync(IPAddress ipAddress, TracerouteOptions traceOptions, CancellationToken cancellationToken) { Task.Run(() => { var buffer = new byte[traceOptions.Buffer]; for (var i = 1; i < traceOptions.MaximumHops + 1; i++) { var tasks = new List <Task <Tuple <PingReply, long> > >(); for (var y = 0; y < 3; y++) { var i1 = i; tasks.Add(Task.Run(() => { var stopwatch = new Stopwatch(); PingReply pingReply; using (var ping = new System.Net.NetworkInformation.Ping()) { stopwatch.Start(); pingReply = ping.Send(ipAddress, traceOptions.Timeout, buffer, new System.Net.NetworkInformation.PingOptions { Ttl = i1, DontFragment = traceOptions.DontFragement }); stopwatch.Stop(); } return(Tuple.Create(pingReply, stopwatch.ElapsedMilliseconds)); }, cancellationToken)); } // ReSharper disable once CoVariantArrayConversion, no write operation Task.WaitAll(tasks.ToArray()); var ipAddressHop = tasks.FirstOrDefault(x => x.Result.Item1 != null)?.Result.Item1.Address; var hostname = string.Empty; try { if (traceOptions.ResolveHostname && ipAddressHop != null) { hostname = Dns.GetHostEntry(ipAddressHop).HostName; } } catch (SocketException) { } // Couldn't resolve hostname OnHopReceived(new TracerouteHopReceivedArgs(i, tasks[0].Result.Item2, tasks[1].Result.Item2, tasks[2].Result.Item2, ipAddressHop, hostname, tasks[0].Result.Item1.Status, tasks[1].Result.Item1.Status, tasks[2].Result.Item1.Status)); // Check if finished if (ipAddressHop != null && ipAddress.ToString() == ipAddressHop.ToString()) { OnTraceComplete(); return; } // Check for cancel if (cancellationToken.IsCancellationRequested) { OnUserHasCanceled(); return; } } // Max hops reached... OnMaximumHopsReached(new MaximumHopsReachedArgs(traceOptions.MaximumHops)); }, cancellationToken); }
public void TraceAsync(IPAddress ipAddress, TracerouteOptions traceOptions, CancellationToken cancellationToken) { Task.Run(() => { byte[] buffer = new byte[traceOptions.Buffer]; int maximumHops = traceOptions.MaximumHops + 1; int hop = 1; do { List <Task <Tuple <PingReply, long> > > tasks = new List <Task <Tuple <PingReply, long> > >(); for (int i = 0; i < 3; i++) { tasks.Add(Task.Run(() => { Stopwatch stopwatch = new Stopwatch(); PingReply pingReply; using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping()) { stopwatch.Start(); pingReply = ping.Send(ipAddress, traceOptions.Timeout, buffer, new System.Net.NetworkInformation.PingOptions() { Ttl = hop, DontFragment = traceOptions.DontFragement }); stopwatch.Stop(); } return(Tuple.Create(pingReply, stopwatch.ElapsedMilliseconds)); })); } Task.WaitAll(tasks.ToArray()); IPAddress ipAddressHop = tasks.FirstOrDefault(x => x.Result.Item1 != null).Result.Item1.Address; string hostname = string.Empty; try { if (ipAddressHop != null) { hostname = Dns.GetHostEntry(ipAddressHop).HostName; } } catch (SocketException) { } // Couldn't resolve hostname OnHopReceived(new TracerouteHopReceivedArgs(hop, tasks[0].Result.Item2, tasks[1].Result.Item2, tasks[2].Result.Item2, ipAddressHop, hostname, tasks[0].Result.Item1.Status, tasks[1].Result.Item1.Status, tasks[2].Result.Item1.Status)); if (ipAddressHop != null) { if (ipAddressHop.ToString() == ipAddress.ToString()) { OnTraceComplete(); return; } } hop++; } while (hop < maximumHops && !cancellationToken.IsCancellationRequested); if (cancellationToken.IsCancellationRequested) { OnUserHasCanceled(); } else if (hop == maximumHops) { OnMaximumHopsReached(new MaximumHopsReachedArgs(traceOptions.MaximumHops)); } }, cancellationToken); }