WP 8.1 中的后台任务运行不止一次
Posted
技术标签:
【中文标题】WP 8.1 中的后台任务运行不止一次【英文标题】:Background Task in WP 8.1 run more than once 【发布时间】:2014-08-09 15:52:16 【问题描述】:我正在尝试实现 windows phone 8.1 通知后台任务。
它是用一个错误实现的! Toast 通知消息将多次出现在操作中心。有时9次。
这是我的代码:
public sealed class my_bg_notifier: IBackgroundTask
public async void Run(IBackgroundTaskInstance taskInstance)
var deferral = taskInstance.GetDeferral();
bool status = await notificationChecker.check();
if (status)
populateNotification(notificationChecker.count);
deferral.Complete();
我尝试调试,所以我在行状态上放置了一个断点。
我很惊讶它被多次调用,这就是为什么我的通知会弹出多次。
并且从调试器断点显示的消息清楚地表明有多个线程同时执行相同的工作。
所以我想通过使用布尔标志来防止多个线程运行该方法,如下所示:
public sealed class my_bg_notifier: IBackgroundTask
private static bool isNotBusy = true;
public async void Run(IBackgroundTaskInstance taskInstance)
if (isNotBusy)
isNotBusy = false;
var deferral = taskInstance.GetDeferral();
bool status = await notificationChecker.check();
if (status)
populateNotification(notificationChecker.count);
deferral.Complete();
isNotBusy = true;
但还是不行。
我的问题是: 为什么后台任务会同时由多个线程运行多次。
我怎样才能阻止这种行为?我应该使用 lock 关键字吗?
【问题讨论】:
【参考方案1】:好啦好啦!!!这是我的错。在我的代码中,我在每次应用启动时注册了后台任务,而不检查它是否已经注册。
所以我使用下面的代码来检查我的任务是否已注册,然后无需再次注册。
var taskRegistered = false;
var exampleTaskName = "ExampleBackgroundTask";
foreach (var task in Background.BackgroundTaskRegistration.AllTasks)
if (task.Value.Name == exampleTaskName)
taskRegistered = true;
break;
来源:http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh977055.aspx
【讨论】:
以上是关于WP 8.1 中的后台任务运行不止一次的主要内容,如果未能解决你的问题,请参考以下文章
Windows Phone 8.1 后台任务 - 无法调试且不会触发
推送通知后台任务崩溃 Windows Phone 8.1 模拟器/设备