前些天,在Windows商店应用论坛搜索了一下“热点问题”,发现有很多关于Background Task的理解误区。以下是关于如何正确使用Background Task的几点建议。

误区:Background Task不是很有用,因为微软对他做了很多的限制。

很多刚接触商店应用的开发者都会有类似的想法,但其实是因为在编写桌面应用程序的时候可以把程序运行在后台并且带少量甚至不带限制。当台式机插入电源的时候这种方式的编程是非常理想的,但并不适用于移动设备或者外置设备。Windows 8 以及8.1都是为了移动设备而定制的,运行在移动设备中的商店应用程序需要关注电池的使用量以及用户的选择,在这样的前提之下,很多的Background
Task API都做了限制。但是微软对此相当关注,并且有很多关于Background Task方案的内部讨论,这样做的目的是为了满足开发者最基本的移动编程的需求。移动设备未来将会对Background Task进行扩展,敬请期待。

误区:我有一个运行时间足够长的代码,如果我的应用是处于挂起状态并且我想运行完这段代码,我可以把这段代码放在后台执行,它会自动执行完成。

这个取决于你的代码运行多长时间,请时刻记住为了节约电池,我们对后台线程做了限制,包括可以运行多少后台任务,每个后台任务运行多久,多少时间触发一次。举个例子在Background Task中你是不可能花3个多小时去下载一个高清版的指环王,但是你可以使用Background Downloader来实现。请记住,Background Task仅仅为小数据量的下载更新而被使用,比如说更新磁贴,更新锁屏图标等,他们并非为下载大量数据而设计的。一般来说,你可以间隔的让你的Background Task触发,执行代码,显示必要的数据,然后继续休息。

误区:当应用处于不活跃状态时,你可以用一个标准的Background Task来播放音频视频。

播放背景音乐可以通过使用MediaElement的背景音乐属性或者可以使用<audio/video>的标签。如果想让你的商店应用正常播放背景音乐你需要实现 SystemMediaTransportControls这个类,这个类是替换MediaControl的存在。他们俩做同样的事,都允许用户在锁屏的时候通过硬件按钮或者在锁屏上的控制条来控制音乐的播放。

误区:当我有权限在锁屏时运行带有计时功能的Background Task的时候我可以无限时运行。

答案可以说正确也可以说错误。当你的程序被用户赋予在锁屏运行的权利时,你的应用可以正常运行。但如果用户把你的应用从锁屏中删除的话,你的Background Task将不会在锁屏状态下运行。这样的设计是为了最大化保证电池的续航时间。

误区:如果我的Background Task仅仅耗时1秒,我就不需���注册一个取消的处理事件

我们必须为Background Task取消做好准备,即使它仅仅耗时1秒乃至更少,Background Task可能因为多种原因而被取消。当你拥有一个长时间运行的Background Task但是你忽略了取消,可能会因此导致数据丢失或者程序错误。为此我们应该在Task运行的时候检查取消请求以确保程序正常运行。我们建议在Background Task代码中多设定检查取消的判定以保证取消事件得以及时传递。虽然这个看起来很麻烦,但的确是一个良好的代码习惯。

误区:不要把后台任务和异步操作混淆使用

不当心的话还是很容易把他俩混淆的。假设有这么一种情况,在后台任务中使用了异步操作,但后台任务还没来得及申请挂起之前的短暂停就因为系统锁定而挂起,这样很容易造成异步无法执行完成,导致内存泄漏。

误区:我需要使用WNS来推送所有的消息,我不可以创建我自己的推送服务。

这个理解是错误的,我们为此添加了很多网络Trigger API来确保用户可以使用自己的推送服务,但是为了使这些api能正常工作,我们需要维护一个后台的数据连接传输的功能。WNS本身就有很多优点比如说节省开支,节约代码,并且是独立于语言。一般WNS被诟病的问题就在于推送不及时。当我们在鼓励用户使用WNS的时候,也同时鼓励为了确保推送质量的开发者使用网络检测的api,谨记当使用自己的网络监测api的时候也需要为锁屏注册相应事件。

相应的链接可供参考

Supporting your app with background tasks (Windows Store apps using JavaScript and HTML

Being productive in the background – background tasks

Guidelines for background tasks (Windows Store apps)

Quickstart: Create and register a background task (Windows Store apps using C#/VB/C++ and XAML)

How to debug a background task (Windows Store apps)