private void LoadProgramsAsync() { if (loadProgramsOperation != null) { loadProgramsOperation.RequestCancellation(); } pgbUpdating.BeginAnimation(ProgressBar.ValueProperty, null, HandoffBehavior.SnapshotAndReplace); pgbUpdating.Value = 0; var activeChannels = TvChannel.AllChannels.Where(x => App.Preferences.IsChannelEnabled(x)); var day = date.Date; var pages = activeChannels.Select(x => new ChannelDay(x, day)).ToList(); var loader = new PagesLoader(); loadProgramsOperation = new BackgroundUIFunction <IEnumerable <TvProgram> >(op => loader.ExecuteLoadPrograms(op, pages).OrderBy(x => x.Date).ToList()); loadProgramsOperation.Finished += new BackgroundOperationBase.FinishedEventHandler(loadProgramsOperation_Finished); loadProgramsOperation.UserTextChange += new BackgroundUIAction.UserTextChangeEventHandler(loadProgramsOperation_UserTextChange); loadProgramsOperation.ProgressChange += new BackgroundUIAction.ProgressChangeEventHandler(loadProgramsOperation_ProgressChange); loadProgramsOperation.ReportProgressChange += new BackgroundUIAction.ReportProgressChangeEventHandler(loadProgramsOperation_ReportProgressChange); pnlPrograms.Visibility = System.Windows.Visibility.Collapsed; pnlUpdating.Visibility = System.Windows.Visibility.Visible; loadProgramsOperation.InvokeAsync(); }
public IEnumerable <TvProgram> ExecuteLoadPrograms(BackgroundUIFunction <IEnumerable <TvProgram> > op, List <ChannelDay> pages) { _op = op; op.ReportProgress = false; op.UserText = "Caricamento programmi"; _programs = new List <TvProgram>(); var missingPages = new List <ChannelDay>(); foreach (var page in pages) { var html = GetHtml(page.Url, true); if (html == null) { missingPages.Add(page); } else { page.SetHtml(html); } } if (missingPages.Any()) { _ewh = new System.Threading.EventWaitHandle(false, System.Threading.EventResetMode.ManualReset); _totalTasks = missingPages.Count; _executedTasks = 0; op.Progress = 1 / (float)_totalTasks; op.ReportProgress = true; op.Progress = 0; foreach (var page in missingPages) { var thisPage = page; var task = new BackgroundFunction <string>(x => GetHtml(thisPage.Url, false)); task.Finished += new BackgroundOperationBase.FinishedEventHandler((o) => { task_Finished(o, thisPage); }); task.InvokeAsync(); } _ewh.WaitOne(); op.Progress = 1; } op.UserText = "Attendere..."; foreach (var page in pages) { try { _programs.AddRange(page.GetProgramsFromSavedHtmlIfAvailable()); } catch (Exception ex) { ex.Data.Add("OriginalStackTrace", ex.StackTrace); this.exception = ex; #if DEBUG throw; #endif } } if (_programs.Count < 20 && exception != null) { throw exception; } return(_programs.OrderBy(x => x.Date)); }