public async Task <IEnumerable <string> > GetLinksRecursiveAsyncTask(string website) { List <string> result = new List <string>(); string mask = WebLinkMask.Match(website).Groups["mask"].Value + '/'; string mainData; try { mainData = await HClient.GetStringAsync(website); } catch (Exception e) { ExceptionEvent?.Invoke(e); return(new List <string>()); } var filteredMatches = WebLinkAddress.Matches(mainData).Cast <Match>() .Where(t => !t.Groups["address"].Value.Contains("http") && t.Groups["linkname"].Value .Any(c => char.IsDigit(c) || char.IsLetter(c))) .Select(t => t.Groups["address"].Value) .Distinct() .ToList(); if (!filteredMatches.Any()) { filteredMatches = WebLinkAddressShort.Matches(mainData).Cast <Match>() .Where(t => !t.Groups["address"].Value.Contains("http")) .Select(t => t.Groups["address"].Value) .Distinct() .ToList(); } if (filteredMatches.Any()) { List <Task <IEnumerable <string> > > threads = new List <Task <IEnumerable <string> > >(); foreach (var match in filteredMatches) { threads.Add(GetLinksRecursiveAsyncTask(mask + match)); } var tempResults = await Task.WhenAll(threads.ToArray()); foreach (var tempResult in tempResults) { result.AddRange(tempResult); } return(result); } result.Add(website); return(result); //////////////////////////// //filteredMatches.Clear(); }