예제 #1
0
        /// <summary>
        /// 删除录播任务
        /// </summary>
        public void DeleteRecording(DownloadToken token)
        {
            var key = token.LinkedSchedule.Key;

            RecordScheduleManager.DeleteSchedule(token.LinkedSchedule);
            _TaskList.Remove(key);
            TaskList.Remove(token);
        }
예제 #2
0
        /// <summary>
        /// 在前台创建录播任务
        /// </summary>
        public DownloadToken StartRecording(Channel channel, SourceRecord source, DateTimeOffset startTime, TimeSpan span)
        {
            // 注册相关信息
            string identifer = channel.UniqueId + source.StationName + startTime.ToString("yyMMddHHmmss");
            var    schedule  = RecordScheduleManager.CreateSchedule(identifer, source.Source.AbsoluteUri, startTime, span);
            var    token     = new DownloadToken()
            {
                Channel        = channel,
                Source         = source.StationName,
                LinkedSchedule = schedule
            };

            _TaskList.Add(schedule.Key, token);
            TaskList.Add(token);

            // 开始任务
            var diff = startTime.Subtract(DateTimeOffset.Now);

            if (diff > TimeSpan.FromMinutes(15))
            {
                RecordScheduleManager.LaunchSchedule(schedule);
                new MessageDialog("由于系统原因,后台定时任务的精度为15分钟,为保证录下您指定的时间段,将提前15分钟开始录制,请预留足够的硬盘空间", "提示").ShowAsync();
            }
            else
            {
                if (diff <= TimeSpan.Zero)
                {
                    RecordScheduleManager.LaunchRecording(schedule);
                }
                else
                {
                    // TODO: 由于ThreadPoolTimer会受到程序进入后台的影响,因此可以考虑在这里改用后台任务强行等待
                    new MessageDialog("由于系统不支持15分钟内的后台定时任务,请您在录制开始前将本程序保持开启并避免最小化!开始后即可关闭程序", "提示").ShowAsync();
                    ThreadPoolTimer.CreateTimer((timer) => RecordScheduleManager.LaunchRecording(schedule), diff);
                }
            }

            return(token);
        }
예제 #3
0
        private RecordService()
        {
            // 如果没有恢复TaskList话则手动恢复
            if (_TaskList.Count == 0)
            {
                Utils.Async.InvokeAndWait(async() => await _TaskList.Restore());
            }

            // 同步前后台的列表
            foreach (var schedule in RecordScheduleManager.GetSchedules())
            {
                var key = schedule.Key;
                if (_TaskList.ContainsKey(key))
                {
                    _TaskList[key].LinkedSchedule = schedule;
                }
                else
                {
                    var token = new DownloadToken()
                    {
                        Channel        = Channel.GetChannel("unknown", "未知频道"),
                        Source         = "未知来源",
                        LinkedSchedule = schedule
                    };
                    _TaskList.Add(schedule.Key, token);
                }
            }
            foreach (var item in _TaskList.ToList()) // 利用ToList方法创建副本
            {
                if (item.Value.LinkedSchedule == null)
                {
                    _TaskList.Remove(item.Key);
                }
            }

            // 初始化前台列表并添加事件监听
            TaskList = new ObservableCollection <DownloadToken>(_TaskList.Values);
        }
예제 #4
0
 /// <summary>
 /// 终止后台录播任务
 /// </summary>
 public void TerminateRecording(DownloadToken token) =>
 RecordScheduleManager.TerminateSchedule(token.LinkedSchedule);