應用於Windows Phone 8 | Windows Phone OS 7.1
調度任務和後台代理使得一個應用即使不在前台運行時也能在後台執行代碼。不同類型的調度任務被設計用於不同類型的幕後處理情境,並因此具有不同的行為和限制。本主題描述了調度、期間和限制等方面的問題。
此主題包含以下部分:
· 調度任務的類型
· 後台代理的生命週期
· 所有調度任務類型的限制
· 周期性代理的限制
· 資源集中型代理的限制
· 相關主題
Scheduled Task的類型
SHAPE \* MERGEFORMAT
下面所列的是Scheduled Task的類型。注意ScheduledTask 是從ScheduledAction派生的。運行於背景代碼存放於從ScheduledTaskAgent派生的類中,而ScheduledTaskAgent是從類BackgroundAgent派生的。
Scheduled Task 類型 |
描述 |
PeriodicTask |
周期性代理,每經過一個周期性迴圈間隔就運行一小段時間。使用此種任務的典型情況包括上傳裝置的位置和執行小量的資料同步。 |
ResourceIntensiveTask |
資源密集型代理,指當phone遇到與處理器activity、電源、網路連接相關的集中需求時需運行相對較長一段時間的後台代理。應用這種任務的一個典型的場合是當phone沒有被使用者使用而未處於活動狀態時,背景同步處理大量的資料到phone上。 |
後台代理的生命週期
SHAPE \* MERGEFORMAT
一個應用可能只有一個後台代理。這個代理可以被註冊為一個PeriodicTask,一個ResourceIntensiveTask,或兩者兼具。對代理運行所使用的調度演算法依賴於任務所註冊的類型。在某一時刻,只有一個代理的執行個體在運行。
代理的代碼在一個BackgroundAgent衍生類別中實現。當代理被啟動,作業系統會調用其OnInvoke(ScheduledTask)方法。在此方法中,應用可以確定是被作為哪種類型的ScheduledTask在運行,然後執行合適的動作。當代理完成了它的任務,它應該調用NotifyComplete 或Abort 以使作業系統知道它完成了。NotifyComplete 應在任務執行成功後使用。如果代理不能執行它的任務-比如所需的服務端不能串連了-那麼代理應該調用Abort,這使得IsScheduled 屬性被置為false。前台應用可以檢查此屬性以確定是否後台調用了Abort。
各調度任務的類型的共同限制
SHAPE \* MERGEFORMAT
下面的約束應用於所有的Scheduled Tasks。
限制 |
描述 |
不支援的APIs |
有很多API不能被任何Scheduled Task使用。使用這些API 不是導致運行時拋出異常,就是導致在提交應用到商店時認證失敗。要查看被限制的API們,見Unsupported APIs for background agents for Windows Phone。 |
記憶體使用量限制 |
周期性代理和資源密集型代理不論任何時刻都不能使用超過6 MB記憶體。音頻代理限制到15 MB。如果一個Scheduled Task 超出了這個記憶體數量,它將被立即終止。 當運行於debugger模式時,記憶體和逾時的限制被臨時取消。你可以使用ApplicationMemoryUsageLimit API 來查詢前台應用和後台代理的記憶體限制。 |
每兩周需重新調度一次 |
使用ScheduledTask 的ExpirationTime 屬性來設定多長時間之後停止任務的調度。當action 是被Add(ScheduledAction)方法所調度時,此值必須被設定為小於兩周的時間。當與任務關連的應用在前台運行時,它可能重新調度任務從而重新把運行期限設定為從現在開始的兩周。存在很多使一個應用的後台代理不會停止或會重生的情況,如果你的應用的Tile被固定在開始畫面上了,你的後台代理在任何調用Update(ShellTileData) 來更新Tile時,其存留時間會被自動擴充到兩周。更多資訊見Tiles for Windows Phone. 如果你的應用被使用者選擇顯示於鎖屏上,你的後台代理的生存期在每次它調用Update(ShellTileData)來更新鎖定屏時自動擴充到兩周。更多的資訊,見Lock screen notifications for Windows Phone 8。 如果你的應用使用一個資源密集型代理自動上傳映像,如果使用者在映像+相機設定頁中為你的應用啟動了此特性,那麼這個資源密集型代理的調度將永不停止。更多的資訊,見 Auto-upload apps for Windows Phone 8。 |
連續兩次崩潰後代理停止調度 |
周期性和資源密集型代理都會在因為超出記憶體配額或且它任何未處理的異常連續兩次退出後停止調度。代理必須通過前台進程才能重新調度。 |
周期性代理的限制
SHAPE \* MERGEFORMAT
下面是代理的調度,期間和普遍性的限制。
限制 |
描述 |
調度間隔:30分鐘 |
周期性代理一般每30分鐘運行一次。為了延長待機時間, 周期性代理可能調整到與其它後台進程相連的時間運行,所以其執行時間可能會有10分種的波動。 |
調度持續:25秒 |
周其性代理通常運行25秒。也有其它的限制條件可能導致一個代理過早終止。 |
省電模式可以阻止執行 |
省電模式是一個選項,使用者可以啟用它來表明優先節省用電量,如果此模式被啟用,即使超過了間隔時間 ,周期性代理可能不再運行。 |
各裝置的周期性代理限制 |
為了協助最大程度的節省電量,有一個對於周期性代理的數量上的硬規定。這跟據每個裝置的配置而不同,它最低可以到6。還有一個限制低於硬規定數,在超過這個限制之後使用者被警告有多個後台代理運行從而使電量被快速消耗。 注意: 如果你想在超出裝置的限制數後添加一個周期性後台代理的話,對Add(ScheduledAction) 的調用將拋出一個InvalidOperationException。因為各裝置的周期性代理數限制的太低,所以你的應用很容易遇到這個問題。所以,當添加周期性代理時,捕獲這個異常是非常重要的,這樣你的應用才不會崩潰。範例程式碼可以在這裡Background agent best practices for Windows Phone.找到。 |
資源密集型代理的限制
SHAPE \* MERGEFORMAT
下面是資源密集型代理的調度,期間,和一般性限制。
限制 |
描述 |
持續:10分鐘 |
資源密集型代理一般只運行10分鐘。還有一些其它限制可能導致一個代理過早終止。 |
需要外部電源 |
資源密集型代理只有在裝置串連到一個外部電源時才運行。 |
非蜂窩串連 |
資源密集型代理只有在建立Wi-Fi串連或通過串連到PC建立網路連接時才運行。 |
最小電量 |
資源密集型代理只有在裝置的電量大於90%時才運行。 |
需要鎖屏 |
資源密集型代理只有在鎖屏時才會運行。 |
不通話 |
資源密集型代理不會在打電話時運行。 |
不能改變網路到蜂窩 |
如果一個資源密集型代理試圖調用AssociateToNetworkInterface(Socket, NetworkInterfaceInfo) 時指定了MobileBroadbandGSM或MobileBroadbandCDMA,調用會失敗。 |
如果一個裝置進入一個狀態,這個狀態滿足了以上所有條件然後一個資源密集型代理開始運行,之後裝置的狀態就發生了改變,然後其中某一項條件不再滿足,那麼這個資源密集型代理將立即終止。
注意: |
由於裝置的所有條件都滿足才能運行資源密集型代理,可能會出現一個代理在某個裝置上永遠不能運行。例如,如果一個使用者沒有串連Wi-Fi或一個PC,它將永不能獲得一個非蜂窩串連,並且資源密集型代理將永不運行。同時,資源密集型代理只能有一個在運行,所以當更多的應用使用資源密集型代理時,某個代理啟動並執行希望更加渺茫。你應該在設計你的應用時仔細斟酌這個問題。 |