在WP7.1中针对Background Agent的新API增加了蛮多非常强大的部分Q以下将介绍Scheduled Multi Tasking的部分?/p>
Scheduled Multi Tasking主要是让Application支援多工模式来执行Q务,让Application不在前景模式下也可以l箋在背景执行某些特定的dQ例如:(x)背景下蝲、背景更新资料、背景唿叫服?#8230;{?/p>
然而,W(xu)P7.1提供Agent的模式,让开发Application时将要背景执行的逻辑Q独立放|于Agent之中透过排程来完成Q务?/p>
但要注意的是QAgent与Application必竟q是属于不同的专案,因ؓ(f)IsolatedStorage中的IsolatedStorageSettings无法qQ要交换资料需透过IsolatedStorage档案或其他方式来交换?/p>
因此Q在设计一个支援Background Agent(ScheduledTaskAgent)的ApplicationӞ我个Z(x)有几个考量Q?/p>
1. 背景执行的逻辑独立成一个类别或模组Q由该模l完成所有背景的d;
2. 使用讑֮?config)的方式,参数或执行l果独立于档案,提供Application与Agent均可以取?
3. Agent是背景的dQ在背景发生Exception的容错机刉要特别设计,量透过通知告知用户;
接下来,细部去讨论Scueduled Tasking由那些重要的元素l成Q?/p>
〉Microsoft.Phone.Scheduler - Scheduled Multi TaskingQ?/p>
WP7.1允许Schedule Task与Background Agent在背景执行它们的dQ然而Schedule Task与Background Agent使用上却有所不同Q?/p>
‧Schedule TaskQ重点在于指定「週期?延迟性」执行Q务,透过讑֮Schedule的时间频率重覆地L行Q?
‧Background AgentQ根据不同的Agent可在l分使用重点Q但较属性一ơ性Q务或接收外部事g所触发的Q?
在Microsoft.Phone.Scheculer针对Scheulde提供了Task与Notification的用,其用法上Schedule Task又是另一U用途,针对Schedule Notification?x)在另一?lt;>q行说明?/p>
然而,在Scheulde Task的用上有几个重要元pM定要M解的Q以下将详细说明Q?/p>
A. ScheduledActionServiceQ?/p>
专用于管理该讑֤所有的Scheduled Actions。Scheduled Actions包括了可用于通知的Alarm、ReminderQ更包括下方介绍的二个运行于Background Agent的Periodic Task与Resource-Intensive Task。其重要的方法如下:(x)
名称 | 说明 |
Add | 向作业系l註册一个Scheduled Action。主要透过Scheduled Action的Name做ؓ(f)识别倹{?/td> |
Find | 透过特定的Name扑ևScheduled Action?/td> |
GetActions(Of T) | 回传pȝ中所有特定类型的Scheduled Actions?/td> |
LaunchForTest | 指定特定的gq时间与ScheduledTask后,要求Background Agent执行该ScheduledTask?/td> |
Remove | 从Scheduled Action Service指定的名称的Scheduled ActionU除?/td> |
Replace | 通常?x)配合F(tun)ind扑և指定Name的Scheduled ActionQƈ加以取代它?/td> |
B. PeriodicTaskQ?/p>
Periodic(定期) Task是一U定期代理运作的观念Q专门针对运作背景Q务所需旉较少Q而且是执行隔间具有规律週期性的情境?/p>
常见的用情境,例如Q定期上传手机的Location资讯、完成少量资料的同步、更新Tile状?#8230;{?/p>
B-1. 使用Periodic Task的约束与旉週期
U束/ | 说明 |
排程旉间隔Q?0?/td> | 通常?0分执行一ơ,在电(sh)力状况不错的情Ş下可以配合其他background process使用Ӟ也可以设定接q上下差?0U的使用?/td> |
排程持箋旉 | 通常支援持箋执行25U,但也可能因ؓ(f)其他塬因造成该agent被提早结束?/td> |
甉|U模式时Q能防止Exception | ׃甉|是否要用节U模式是q戯行选择。如果该模式被选择Ӟ当电(sh)池进入节U模式时Qperiodic task有可能无法使用?/td> |
每一个设备在Periodic Task的限?/td> | Z让电(sh)池最大化使用Q不同的讑֤对电(sh)池的使用有一定的控制围Q因此,可能限制一个设备最多有几个Agent可以被执行,如果过Q它?x)自动被turn off?/td> |
C. ResourceIntensiveTaskQ?/p>
Resource-Intensive(资源密集) Task是针寚w要相对较长的处理旉Q或是遇到需使用大量手机甉|、网路等资源时较为适用的类型?/p>
常见的用情境,例如Q同步大量的资料(如App需要下载大量的资料x机端才能让Appq行)…{?/p>
C-1. 使用ResourceIntensiveTask的约束与旉週期
U束/ | 说明 |
持箋旉Q?0分鐘 | 通常resource-intensive agent一般执行持l约10分鐘Q如果有其他如下方的限制Q将?x)提早停止agent的执行?/td> |
外部?sh)力需?/td> | 除非讑֤已连接外部的?sh)力来源Q否则无法执行?/td> |
无行动网路能U能?/td> | 除非讑֤已通过Wi-Fi、行动网路或q接到PCQ否则无法执行?/td> |
最电(sh)力需?/td> | 除非?sh)力?0%的情形,否则无法执行resource-intensive agent?/td> |
讑֤萤幕被锁定状?/td> | 除非?sh)话处于锁定的状态,否则无法执行resource-intensive agent?/td> |
通话中无法?/td> | 当手机处于通中状态时Qresource-intensive agent无法使用?/td> |
不能改变|\状态ؓ(f)行动|\ | 如果resource-intensive agent企图d叫AssociateToNetworkInterface(Socket, NetworkInterfaceInfo)来指定Q何一U行动网?GSM或CDMA)Q则?x)失败?/td> |
q二个元素其实都是由ScheduleAction与ScheduledTask抽象cd实作出来的,它们分别有自w用的情境与适用性,
二者最大的差别卛_于用情境与需要耗用手机资源的多,以及(qing)resource-intensive task要在萤幕锁定与电(sh)?0%以上才能执行?/p>
׃使用resource-intensive task要求的限制实在很多,因此Q在设计Scheduled Task旉要特别考虑q个部分Q至于其他相关的
属性就大同异了,以下介其较长使用到的属性:(x)
名称 | 说明 |
Description | 讑֮/取得有关该Scheduled Task的描q。该描述的内容将?x)出C手机「Settings/Applications/Background Tasks Settings」的画面中?nbsp; 如下图:(x)以Background Scheulde为程式名Uͼ(x) ![]() ![]() |
ExpirationTime | 讑֮/取得Scheduled Task到期的时间?/td> |
IsScheduled | 取得Scheduled Task状态是否ؓ(f)启动?/td> |
LastExitReason | 取得Agent执行最q一ơTask被结束的理由?/td> |
LastScheduledTime | 取得Agent执行最q一ơTask的时_(d)以手机时间ؓ(f)丅R?/td> |
Name | 取得Scheduled Action的名U?/td> |
了解了二个元素的基本属性与使用情境后,有几个用Background Agent要特别注意的Q?/p>
1. 一个Application只能有一个Background agent(ScheduledTaskAgent)Q但Agent可以单独使用PeriodicTask、ResourceIntensiveTask
或者二个同时用。要注意的是一个Agent只能有一个PeriodicTask与一个ResourceIntensiveTask?/p>
2. Background Agent(ScheduledTaskAgent)Q?/p>
2-1. 透过OnInvoke(ScheduleTask)触发Agent逻辑的部?
2-2. 已成功执行完所有Q务时Q记得唿叫NotifyComplete()告知Agent已完成Q?
2-3. 如果在执行过E发生错误或是无法执行TaskӞ要记得唿叫Abort()告知Agent接下来取消运作,然而即可以在Application端取?/p>
ScheduledTask中的IsScheduled属性ؓ(f)false。但要注意的是如何Abort()之后Q要记得使用ShellToast告知用户Q以免用户不知道?/p>
3. Background Agent在记忆体使用量的控制Q?/p>
3-1. Periodic agents与resource-intensive agents允许在每ơ执行TaskӞ不超q?MB记忆体用量?/p>
3-2. Audio agents则限制不能超q?5MB记忆体用量?/p>
3-3. 在Debug模式下则不限Ӟ但可以透过
4. 预设AgentZ个星期后需要重新安排ScheduledQ?/p>
虽然可以透过ScheduledTask中的LastScheduledTimeȝ认究竟最q一ơ执行的DatetimeZQƈ且用ExpirationTimeL定Task
可运行的旉长度。但是用ScheduledTask可能因ؓ(f)条g限制(例如遇到执行Task时没|\能力Q自动要求Agent延后执行)Q造成Task
长时间没有被执行Qؓ(f)了确保Task不会(x)一直占住不使用Q透过讑֮2个星期可存活旉Q可以自动解册个问题。设定ExpirationTime?/p>
在每一ơ执行Application于前景状冉|Q进行判断与讑֮?/p>
5. Scheduled Agent在连l二个Crash后自动取消:(x)
׃使用Periodic agents与resource-intensive agetns是交由AgentLӞ因此Q当Agentq箋出现二次以上的Crash或无法预期的错误Q?/p>
该Agent会(x)被停止,需透过Application回到前景模式再重新启动它?/p>