[WP7] 背景工作排程

在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加入排程專案參考。

SNAGHTMLd7c6eb

 

接下來就是在App放一個button來啟動工作排程啦:

image

		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

 

Dotblogs 的標籤:,,