示例#1
0
        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();
        }
示例#2
0
        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));
        }