我正在开发一款具有实时翻转磁贴的Windows Phone 8应用。我将创建一个预定的代理(定期任务不是资源密集型),它将使用本地数据更新实时磁贴。
整个应用程序无法以任何方式连接到互联网,它只使用本地数据。所以推送通知是不可能的。
我需要在后台代理和/或前台应用中更新实时磁贴,无论哪个先发生。
但是,如何确保前台应用程序和后台代理不会互相踩到脚趾?我有两个主要选项:
使用互斥锁(AFAIK后台代理程序在不同的进程中运行,因此锁定(监视器)是不可能的)。但我担心它会有很高的性能成本(获取并释放互斥锁,就是这样)。
当前台应用程序启动时,我将始终删除代理,完成其工作并重新安排代理。在前台应用程序和后台代理之间不会有任何重叠的机会,但是整个添加/删除代理也可能很长,而且在删除代理之后但在将其添加回来之前,用户可能会关闭应用程序。
我真的在这两种方法之间徘徊,并且不能说出哪种方法最好。
PS:您无法从代理自己的代码中重新安排代理,对吧?
答案 0 :(得分:3)
<强>互斥强>
Windows Phone 7和8的互斥锁选项为officially recommended by the MSDN documentation。
我使用此选项,在后台代理和前台应用程序之间共享数据时没有遇到明显的性能问题,我的目标是WP7.1并在第一代和第二代WP7设备(LG E900和Lumia 800)上进行测试。
显然,使用互斥锁时,关键是尽可能短的时间锁定资源。当尝试获取后台代理中资源的锁定时,WaitHandle.WaitOne
的超时功能非常有用,因为后台代理只有25秒运行。
注意:如果您仅定位Windows Phone 8,或者通过第二个项目/二进制文件,则可以使用不同的方法(用于进程间通信的命名事件)。 Peter Torr wrote about it on the official Windows Phone Developer blog
启用/禁用后台代理
你提到的第二种方法风险更大,因为我们不知道操作系统为添加或删除后台代理提供了什么保证 - 如果不立即删除会发生什么?如果新更新的后台代理在前台应用程序运行时触发会发生什么?等
代理续订
后台代理无法自行续订 - 一旦添加they will run for a maximum of two weeks,除非前景应用程序续订。这将阻止后台代理运行用户不再使用的应用程序。