示例#1
0
        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();
        }