Example #1
0
        public Match[] UpdateMatches(Match[] notSortedMatches, CancellationToken token)
        {
            if (notSortedMatches == null)
            {
                throw new ArgumentNullException("notSortedMatches был null");
            }

            DotaPageWorker dotaPageWorker  = new DotaPageWorker();
            List <Match>   matchesNew      = new List <Match>();
            Match          LastoldMatch    = notSortedMatches[0];
            bool           lastMatchloaded = false;

            while (!lastMatchloaded)
            {
                List <Match> matches = new List <Match>();
                if (!TryLoadPage(dotaPageWorker, "Страница с матчами не загружается, если ее не загрузить, то парсинг прервется", token))
                {
                    return(matches.ToArray());
                }

                string[] matchURLs = dotaPageWorker.GetMatchesURLs();
                foreach (var matchURL in matchURLs)
                {
                    if (matchURL == LastoldMatch.URL)
                    {
                        lastMatchloaded = true;
                        break;
                    }
                    DotaMatchPageWorker matchPageWorker = new DotaMatchPageWorker(matchURL);

                    matchPageWorker.AfterLoadPage += (sender, URL) =>
                    {
                        MatchPageLoaded?.Invoke(this, URL);
                    };

                    if (!TryLoadPage(matchPageWorker, "Страница с матчем не загружается", token))
                    {
                        continue;
                    }

                    matches.Add(GetMatch(matchPageWorker));
                    MatchLoaded?.Invoke(this, matchPageWorker.URL);
                }

                PageOfMatchesLoaded?.Invoke(this, dotaPageWorker.URL);


                matchesNew.AddRange(matches);
                if (dotaPageWorker.NextPage == null)
                {
                    break;
                }

                dotaPageWorker = new DotaPageWorker(dotaPageWorker.NextPage);
            }
            matchesNew.AddRange(notSortedMatches);
            return(matchesNew.ToArray());
        }
Example #2
0
        }   //TODO: оделать многопоточное получение матчей

        /// <summary>
        /// Метод парсит с сайта cybersport.ru все матчи многопоточно с возможностью отмены
        /// </summary>
        /// <param name="token">Токен отмены</param>
        public Match[] GetMatchesMultyThread(CancellationToken token)
        {
            DotaPageWorker         dotaPageWorker = new DotaPageWorker();
            List <Match>           matches        = new List <Match>();
            List <Task <Match[]> > tasks          = new List <Task <Match[]> >();

            while (true)
            {
                if (token.IsCancellationRequested)
                {
                    throw new System.OperationCanceledException("Операция отменена", token);
                }

                tasks.Add(Task.Run(() => GetMatches(dotaPageWorker, token)));
                while (dotaPageWorker.Page == null)
                {
                    Thread.Sleep(100);
                }
                if (dotaPageWorker.NextPage == null)
                {
                    break;
                }

                dotaPageWorker = new DotaPageWorker(dotaPageWorker.NextPage);
            }

            while ((from task in tasks
                    where task.Status == TaskStatus.RanToCompletion
                    select task).Count() == tasks.Count)
            {
                if (token.IsCancellationRequested)
                {
                    throw new System.OperationCanceledException("Операция отменена", token);
                }
                foreach (var t in tasks)
                {
                    if (t.IsFaulted)
                    {
                        throw t.Exception.InnerException;
                    }
                }

                Thread.Sleep(100);
            }

            foreach (var t in tasks)
            {
                matches.AddRange(t.Result);
            }

            return(matches.ToArray());
        }
Example #3
0
        /// <summary>
        /// Метод парсит с сайта cybersport.ru все матчи Dota2
        /// </summary>
        /// <param name="token">Токен отмены</param>
        /// <returns>Матчи</returns>
        public Match[] GetMatches(CancellationToken token)
        {
            DotaPageWorker dotaPageWorker = new DotaPageWorker();
            List <Match>   matches        = new List <Match>();

            while (true)
            {
                matches.AddRange(GetMatches(dotaPageWorker, token));
                if (dotaPageWorker.NextPage == null)
                {
                    break;
                }

                dotaPageWorker = new DotaPageWorker(dotaPageWorker.NextPage);
            }

            return(matches.ToArray());
        }
Example #4
0
        /// <summary>
        /// Получение матчей по определенной страницу заданной dotaPageWorker
        /// </summary>
        /// <param name="dotaPageWorker">Страница с матчами</param>
        /// <param name="token">Токен отмены</param>
        /// <returns></returns>
        private Match[] GetMatches(DotaPageWorker dotaPageWorker, CancellationToken token)
        {
            if (dotaPageWorker == null)
            {
                throw new ArgumentNullException("dotaPageWorker был пуст");
            }

            List <Match> matches = new List <Match>();

            if (!TryLoadPage(dotaPageWorker, "Страница с матчами не загружается, если ее не загрузить, то парсинг прервется", token))
            {
                return(matches.ToArray());
            }

            string[] matchURLs = dotaPageWorker.GetMatchesURLs();
            foreach (var matchURL in matchURLs)
            {
                DotaMatchPageWorker matchPageWorker = new DotaMatchPageWorker(matchURL);

                matchPageWorker.AfterLoadPage += (sender, URL) =>
                {
                    MatchPageLoaded?.Invoke(this, URL);
                };

                if (!TryLoadPage(matchPageWorker, "Страница с матчем не загружается", token))
                {
                    continue;
                }

                matches.Add(GetMatch(matchPageWorker));
                MatchLoaded?.Invoke(this, matchPageWorker.URL);
            }

            PageOfMatchesLoaded?.Invoke(this, dotaPageWorker.URL);
            return(matches.ToArray());
        }
Example #5
0
        /// <summary>
        /// Метод парсит с сайта cybersport.ru первую страницу с мачами Dota2;
        /// </summary>
        /// <param name="token">Токен отмены</param>
        /// <returns>Матчи</returns>
        public Match[] GetMatchesPage(CancellationToken token)
        {
            DotaPageWorker dotaPageWorker = new DotaPageWorker();

            return(GetMatches(dotaPageWorker, token));
        }
Example #6
0
        /// <summary>
        /// Метод парсит с сайта cybersport.ru первую страницу с мачами Dota2;
        /// </summary>
        /// <returns>Матчи</returns>
        public Match[] GetMatchesPage()
        {
            DotaPageWorker dotaPageWorker = new DotaPageWorker();

            return(GetMatches(dotaPageWorker, new CancellationToken()));
        }