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()); }
} //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()); }
/// <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()); }
/// <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()); }
/// <summary> /// Метод парсит с сайта cybersport.ru первую страницу с мачами Dota2; /// </summary> /// <param name="token">Токен отмены</param> /// <returns>Матчи</returns> public Match[] GetMatchesPage(CancellationToken token) { DotaPageWorker dotaPageWorker = new DotaPageWorker(); return(GetMatches(dotaPageWorker, token)); }
/// <summary> /// Метод парсит с сайта cybersport.ru первую страницу с мачами Dota2; /// </summary> /// <returns>Матчи</returns> public Match[] GetMatchesPage() { DotaPageWorker dotaPageWorker = new DotaPageWorker(); return(GetMatches(dotaPageWorker, new CancellationToken())); }