在Wondwos Phone 7.1中,提供了可以進行多個工作排程的方法,我們可以定義一個工作內容之後,交由作業系統來執行這段程式,不過因為手機本身的資源限制,所以並不是所有的工作都可以執行。
在Wondwos Phone 7.1中,提供了可以進行多個工作排程的方法,我們可以定義一個工作內容之後,交由作業系統來執行這段程式,不過因為手機本身的資源限制,所以並不是所有的工作都可以執行。Windows Phone 7.1中支援二種可以在背景排程執行的工作:
這二種工作執行的方式都有要求的條件:
PeriodicTask:
排程時間:每30分鐘執行一次,誤差可能約10分鐘
記憶體使用量:小於6 MB
可執行時間:25秒。
省電模式時可能不執行
可執行上限數:6個。
ResourceIntensiveTask:
記憶體使用量:小於6 MB
可執行時間:10分鐘。
執行條件:外接電源、需使用Wi-Fi或是直接連接電腦、電池電源需大於90%、營幕不可鎖定、不在接電話的狀態等。
每個應用程式最多只能設定一個PeriodicTask 和 ResourceIntensiveTask,工作的到期日(ExpirationTime)必需在二週內,而且有部份API無法使用,要排定工作必須在使用者第一次執行的應用程式的時候,沒辦法在安裝時就啟動排程,使用上的限制還蠻多的。
建立排程的方式還蠻簡單的,先建立一個基本的Windows Phone App,再建立排程的專案,App加入排程專案參考。
接下來就是在App放一個button來啟動工作排程啦:
private void btnStart_Click(object sender, RoutedEventArgs e)
{
PeriodicTask task = (PeriodicTask)ScheduledActionService.Find("TaskAgent");
if (task == null)
{
task = new PeriodicTask("TaskAgent");
task.Description = "顯示目前時間";
}
else
{
//沒在排程狀態
if (!task.IsScheduled)
{
string lastResult;
if (IsolatedStorageSettings.ApplicationSettings.TryGetValue<string>("taskResult", out lastResult))
{
if (lastResult == "Succes")
{
MessageBox.Show("使用者已關閉排程");
ScheduledActionService.Remove(task.Name);
return;
}
else if (lastResult == "Faillure")
{
}
}
}
ScheduledActionService.Remove(task.Name);
}
//到期時間
task.ExpirationTime = DateTime.Now.AddDays(14);
try
{
ScheduledActionService.Add(task);
#if DEBUG_AGENT
ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(60));
#endif
}
catch (InvalidOperationException)
{
MessageBox.Show("排程執行已達上限數或使用者停止相關功能。");
}
catch (SchedulerServiceException sse)
{
MessageBox.Show(sse.Message);
}
}
把工作加入排程之前,記得先判斷是否有重覆;如果已經有排程了,那就要判斷目前排程執行的狀況,若是需要重新排程,就把目前的排程先移除之後再重新加入。
另外,測試時可以利用ScheduledActionService.LaunchForTest來達到快速執行(不然最少都要等30分鐘左右哦!)
protected override void OnInvoke(ScheduledTask task)
{
if (task is PeriodicTask)
{
// Logic for Periodic Task
}
else
{
// Logic for ResourceIntensiveTask
}
// Use this to invoke your task much quicker when debugging
#if DEBUG_AGENT
ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(60));
#endif
// Tell the Scheduler we are done
NotifyComplete();
}
相關連結:
Background Agents Overview for Windows Phone
How to: Implement Background Agents for Windows Phone
Multi tasking in Windows Phone 7.1