private async Task <PageObject> LoadPageObjectAsync(MangaObject MangaObject, ChapterObject ChapterObject, PageObject PageObject, CancellationToken ct, IProgress <Int32> progress) { try { await TaskConcurrencySemaphore.WaitAsync(ct); ct.ThrowIfCancellationRequested(); ISiteExtension SiteExtension = CORE.SiteExtensions.First(_SiteExtension => PageObject.Url.Contains(_SiteExtension.ExtensionDescriptionAttribute.URLFormat)); using (WebDownloader WebDownloader = new WebDownloader(SiteExtension.Cookies)) { WebDownloader.Referer = SiteExtension.ExtensionDescriptionAttribute.RefererHeader; DownloadProgressChangedEventHandler ProgressEventHandler = (s, e) => { if (!Equals(progress, null)) { progress.Report((Int32)Math.Round((Double)e.ProgressPercentage * 0.9)); } ct.ThrowIfCancellationRequested(); }; WebDownloader.DownloadProgressChanged += ProgressEventHandler; String PageWebContent = await WebDownloader.DownloadStringTaskAsync(PageObject.Url).Retry(DOWNLOAD_TIMEOUT); PageObject = SiteExtension.ParsePageObject(PageWebContent); WebDownloader.DownloadProgressChanged -= ProgressEventHandler; } if (!Equals(progress, null)) { progress.Report(100); } return(PageObject); } finally { TaskConcurrencySemaphore.Release(); } }