Background Task(背景工作)之 PeriodicTask(周期任務)和 ResourceIntensiveTask(耗用大量資源的工作)
介紹
與眾不同 windows phone 7.5 (sdk 7.1) 之背景工作
PeriodicTask - 周期任務
ResourceIntensiveTask - 耗用大量資源的工作(通常用於手機與電腦同步資料)
樣本
示範如何註冊和運行 PeriodicTask 類型的任務和 ResourceIntensiveTask 類型的任務
1 、後台代理
MyScheduledTaskAgent/ScheduledAgent.cs
/* * 本例示範如何由背景工作定時彈出 Toast,以及如何定時更新應用程式瓷磚的 Badge * 建議使用 ScheduledTaskAgent 類型的模板建立此項目 * * BackgroundAgent - 後台代理類,抽象類別,它是 ScheduledTaskAgent、AudioPlayerAgent 和 AudioStreamingAgent 的基類 * NotifyComplete() - 用於通知系統,代理已經完成了當前的任務,調用此方法後,系統才會去準備執行下一次任務 * Abort() - 用於通知系統,放棄此次和以後的任務,對應的 ScheduledAction 的 IsScheduled 將變為 false * * ScheduledTaskAgent - 後台計劃任務代理類,抽象類別 * OnInvoke(ScheduledTask task) - 背景工作每次執行時都會調用此方法 * * ScheduledAgent - 用於示範背景工作的類,繼承自 ScheduledTaskAgent,需要重寫 ScheduledTaskAgent 的 OnInvoke() 方法 * * DeviceStatus.ApplicationMemoryUsageLimit - 程式在此時被分配到的記憶體數量(單位:位元組),每次擷取此值可能都不一樣,但是肯定不會超過 6MB * * ShellToast - 用於管理 Toast * Title - Toast 的標題 * Content - Toast 的內容 * NavigationUri - 單擊 Toast 之後連結到的目標地址(Uri 類型) * Show() - 顯示 Toast(註:如果 Show 方法的調用程式正在前台運行,則不會顯示 Toast) * * ScheduledActionService.LaunchForTest(string name, TimeSpan delay) * 對於 ScheduledTask 類型的任務,在指定的時間後馬上執行任務。其用於開發目的,僅在開發工具部署的應用程式中有效 * PeriodicTask 和 ResourceIntensiveTask 均繼承自 ScheduledTask */ using System.Windows; using Microsoft.Phone.Scheduler; using Microsoft.Phone.Shell; using Microsoft.Phone.Info; using System; using System.Linq; namespace MyScheduledTaskAgent { public class ScheduledAgent : ScheduledTaskAgent { /* * _classInitialized - 用於標記 ScheduledAgent 是否已經被初始化 * 標記成 volatile 是為了避免編譯器認為此欄位無外部修改,而將其最佳化放入寄存器(標記成 volatile 的欄位只會放在記憶體中) * 一般來說,多任務環境下各任務間共用的欄位應該被標記為 volatile */ private static volatile bool _classInitialized; public ScheduledAgent() { if (!_classInitialized) { _classInitialized = true; Deployment.Current.Dispatcher.BeginInvoke(delegate { Application.Current.UnhandledException += ScheduledAgent_UnhandledException; }); } } private void ScheduledAgent_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) { if (System.Diagnostics.Debugger.IsAttached) { System.Diagnostics.Debugger.Break(); } } protected override void OnInvoke(ScheduledTask task) { string toastTitle = ""; if (task is PeriodicTask) toastTitle = "PeriodicTask"; else if (task is ResourceIntensiveTask) toastTitle = "ResourceIntensiveTask"; string toastContent = "MemoryUsageLimit: " + DeviceStatus.ApplicationMemoryUsageLimit; // 彈出 Toast ShellToast toast = new ShellToast(); toast.Title = toastTitle; toast.Content = toastContent; toast.NavigationUri = new Uri("/BackgroundTask/BackgroundAgentDemo.xaml?param=abc¶m2=xyz", UriKind.Relative); toast.Show(); // 更新應用程式磁貼的 Badge ShellTile applicationTile = ShellTile.ActiveTiles.First(); StandardTileData newTile = new StandardTileData { Count = new Random().Next(1, 99) }; applicationTile.Update(newTile); #if DEBUG // 15 秒後執行“task.Name”任務 ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(15)); #endif NotifyComplete(); } } } /* * 主程式引用此項目後,會在 manifest 中添加如下資訊: * <ExtendedTask Name="BackgroundTask"> * <BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="MyScheduledTaskAgent" Source="MyScheduledTaskAgent" Type="MyScheduledTaskAgent.ScheduledAgent" /> * </ExtendedTask> */
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/