Пример #1
0
        /// <summary>
        /// 升级缓存
        /// </summary>
        /// <param name="channels">需要缓存的频道列表</param>
        /// <returns></returns>
        private async Task AddCacheChannel(params Channel[] channels)
        {
            var list        = channels.Distinct().ToArray();
            var localFolder = ApplicationData.Current.LocalFolder;
            var file        = await localFolder.CreateFileAsync("CacheList.json", CreationCollisionOption.OpenIfExists);

            string content = await FileIO.ReadTextAsync(file);

            if (string.IsNullOrEmpty(content))
            {
                content = "[]";
            }
            var results = JsonConvert.DeserializeObject <List <CacheModel> >(content);
            var tasks   = new List <Task>();

            if (list.Length > 0)
            {
                foreach (var channel in list)
                {
                    tasks.Add(Task.Run(async() =>
                    {
                        var articles = await AppTools.GetSchemaFromUrl(channel.Link, true);
                        int now      = AppTools.DateToTimeStamp(DateTime.Now.ToLocalTime());
                        if (results.Any(p => p.Channel.Link == channel.Link))
                        {
                            var target       = results.Where(p => p.Channel.Link == channel.Link).First();
                            target.Feeds     = articles;
                            target.CacheTime = now;
                        }
                        else
                        {
                            results.Add(new CacheModel()
                            {
                                Channel = channel, Feeds = articles, CacheTime = now
                            });
                        }
                    }));
                }
                try
                {
                    Task.WaitAll(tasks.ToArray(), new TimeSpan(0, 0, 24));
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
                finally
                {
                    content = JsonConvert.SerializeObject(results);
                    await FileIO.WriteTextAsync(file, content);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// 从文件中获取需要通知的源,利用Task的并行,最大限度地获取选取源的更新信息
        /// 以获取源的第一篇文章为参照,若该文章已读,说明用户已经打开频道看过了,此时没有通知的必要
        /// 若第一篇文章已经出现在已推送列表中,表面该源没有更新文章,同样不推送
        /// 若以上条件均不满足,则推送第一篇文章进行简单提醒即可。
        /// </summary>
        /// <param name="taskInstance"></param>
        async void IBackgroundTask.Run(IBackgroundTaskInstance taskInstance)
        {
            var def       = taskInstance.GetDeferral();
            var toastList = await GetNeedToastChannels();

            var historyList = await GetToastHistory();

            var tasks    = new List <Task>();
            var readList = await GetAlreadyReadFeed();

            foreach (var t in toastList)
            {
                tasks.Add(Task.Run(async() =>
                {
                    try
                    {
                        var items = await AppTools.GetSchemaFromUrl(t.Link);
                        if (items != null && items.Count > 0)
                        {
                            string title   = t.Name;
                            string content = string.Empty;
                            var history    = historyList.Where(h => h.ChannelId == t.Id).FirstOrDefault();
                            var first      = items.First();
                            if (history == null)
                            {
                                historyList.Add(new ChannelTarget()
                                {
                                    ChannelId = t.Id, LastArticleId = first.InternalID
                                });
                                if (!readList.Any(p => p == first.InternalID))
                                {
                                    content = first.Title;
                                }
                            }
                            else
                            {
                                if (first.InternalID != history.LastArticleId)
                                {
                                    if (!readList.Any(p => p == first.InternalID))
                                    {
                                        content = first.Title;
                                        history.LastArticleId = first.InternalID;
                                    }
                                }
                            }
                            if (!string.IsNullOrEmpty(content))
                            {
                                SendNotification(title, first);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(ex.InnerException.Message);
                    }
                }));
            }
            Task.WaitAll(tasks.ToArray(), 24000);
            await ReplaceToastHistory(historyList);

            def.Complete();
        }