private async Task <PhotosetSearchPageResult> PhotosetsGetListForPage(int page) { var searchedPhotoSetsForPage = await Task.Run(() => { var photoCollection = PhotosetsGetList(page, SearchOptions_PerPage_MAX); return(photoCollection); }); var result = new PhotosetSearchPageResult(page, searchedPhotoSetsForPage); return(result); }
/// <summary> /// paralelni dohledani seznamu PhotoSetu /// </summary> public async Task <List <Photoset> > ParallelPhotosetsGetList(Action <ParallelOperationData <PhotosetSearchPageResult> > progressEvent = null, int taskCount = DefaultParallelConnections) { var pageCount = taskCount; // pripadna podporapredcasneho ukonceni tasku, viz: https://johnbadams.wordpress.com/2012/03/10/understanding-cancellationtokensource-with-tasks/ // seznam tasku s http dotazy - zatim rozbehnu nekolik uvodnich dotazu a postupne po jejich jednotlivem splneni pridavam dalsi var taskList = Enumerable.Range(1, pageCount) .Select(p => PhotosetsGetListForPage(p)) .ToList(); var data = new ParallelOperationData <PhotosetSearchPageResult>(GetTaskSheduler(), progressEvent, taskList); data.ReportProgress(); while (taskList.Any()) { // pockam na prvni dokonceny task Task <PhotosetSearchPageResult> firstFinishedTask = await Task.WhenAny(taskList); taskList.Remove(firstFinishedTask); PhotosetSearchPageResult finishedTask = await firstFinishedTask; // vysledek hotoveho tasku // seznam j*z stazenych photosetu var downloaded = data.Results.SelectMany(p => p.PhotosetCollection).ToList(); // detekce posledni stranky - downloaduju stale dalsi a dalsi stranky az do doby kdy zacnou prichazet duplicitni zaznamy v PhotoCollection, // to urcite neni optimalni, ale flickr bohuzel nijak posledni stranku neidentifikuje :-/ takze ji musim takto pseudo dohledat var anyNewPhotosets = finishedTask.PhotosetCollection.Any(p => !downloaded.Any(r => r.PhotosetId == p.PhotosetId)); // posledni stranka nebyla dohledana, takze rozbehnu task pro stahovani dalsi if (anyNewPhotosets) { data.AddResult(finishedTask); data.ReportProgress(finishedTask); pageCount++; taskList.Add(PhotosetsGetListForPage(pageCount)); } } data.SetCompletedState(); data.ReportProgress(); var final = data.Results.SelectMany(p => p.PhotosetCollection).ToList(); return(final); }