/// <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); } } }
/// <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(); }