Exemple #1
0
        static IEnumerable <HostItem> GetUpdatedList(Source sourceData, IEnumerable <string> contents)
        {
            IDnsClient dnsClient     = new Libs.Updater.Dns.DnsClient(_logger, IPAddress.Parse(sourceData.FirstDNS), IPAddress.Parse(sourceData.SecondDNS));
            var        concurrentBag = new ConcurrentBag <HostItem>();
            var        tasks         = new ConcurrentBag <Task>();

            var details = contents.Select(line =>
            {
                var arr = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);
                return(new HostItem {
                    HostName = arr[1], IPAddress = IPAddress.Parse(arr[0])
                });
            });

            // Create and add a task for each of the lines.
            // Update the IP address for each hostnames. If failed, its default value will be used as output.
            Parallel.ForEach(details, item =>
            {
                tasks.Add(Task.Run(async() =>
                {
                    var newItem = new HostItem {
                        HostName = item.HostName
                    };
                    var ipAddress = await dnsClient.ResolveHostNameAsync(item.HostName);
                    if (ipAddress != null)
                    {
                        if (!ipAddress.Equals(item.IPAddress))
                        {
                            newItem.IPAddress = ipAddress;
                            newItem.Status    = "updated";
                        }
                        else
                        {
                            // Same value, so just use its default value.
                            newItem.IPAddress = item.IPAddress;
                        }
                    }
                    else
                    {
                        // Failed to resolve, so use its default IP address.
                        newItem.IPAddress = item.IPAddress;
                        newItem.Status    = "not found";
                    }

                    concurrentBag.Add(newItem);
                }));
            });

            Task.WaitAll(tasks.ToArray());

            return(concurrentBag);
        }
Exemple #2
0
        private IEnumerable <HostItem> GetUpdatedList(Source sourceData, IEnumerable <string> contents)
        {
            IDnsClient dnsClient     = new Libs.Updater.Dns.DnsClient(_logger, IPAddress.Parse(sourceData.FirstDNS), IPAddress.Parse(sourceData.SecondDNS));
            var        concurrentBag = new ConcurrentBag <HostItem>();

            var details = contents.Select(line =>
            {
                var arr = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);
                return(new HostItem {
                    HostName = arr[1], IPAddress = IPAddress.Parse(arr[0])
                });
            });

            // Create and add a task for each of the lines.
            // Update the IP address for each hostnames. If failed, its default value will be used as output.
            Parallel.ForEach(details, item =>
            {
                // Initialize with default values.
                var newItem = new HostItem {
                    HostName = item.HostName, IPAddress = item.IPAddress
                };

                IPAddress ipAddress = null;
                try
                {
                    ipAddress = dnsClient.ResolveHostName(item.HostName);
                    if (ipAddress != null)
                    {
                        // Value not same, so update it.
                        if (!ipAddress.Equals(item.IPAddress))
                        {
                            newItem.IPAddress = ipAddress;
                            newItem.Status    = "updated";
                        }
                    }
                    else
                    {
                        // Failed to resolve, so use its default IP address.
                        newItem.Status = "not found";
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogException(ex);
                    newItem.Status = ex.Message;
                }

                concurrentBag.Add(newItem);
            });

            return(concurrentBag);
        }