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