在我的 Windows 8 Metro 应用程序的后台任务中运行时,Client.GetAsync 对我来说似乎失败了。
我尝试同时使用 TimeTrigger 和 MaintenanceTrigger。看来也不例外。调试它时,它只会在该行退出(如果我一直按 step over),即使还有更多的执行方式以及围绕它的 try-catch。
这让我相信 Windows 正在取消我的任务。所以我听了取消的事件没有运气。
我已将 Internet 访问声明为一项功能,并且该任务已正确注册。此外,我的应用程序具有完全锁屏访问权限。
我究竟做错了什么?
这是我目前用来注册后台任务的代码。
if (await ObtainLockScreenAccess())
{
const string name = "Task";
var updaterTasks = BackgroundTaskRegistration.AllTasks.Where(t => t.Value.Name == name);
if (!updaterTasks.Any())
{
var builder = new BackgroundTaskBuilder();
builder.Name = name;
builder.TaskEntryPoint = "Stackstabilizer.BackgroundTasks.UpdateBackgroundTask";
var trigger = new MaintenanceTrigger(15, false);
var condition = new SystemCondition(SystemConditionType.InternetAvailable);
builder.AddCondition(condition);
builder.SetTrigger(trigger);
var task = builder.Register();
Debug.WriteLine("Task has been registered");
}
}
编辑这是后台任务签名:
namespace Stackstabilizer.BackgroundTasks
{
// You must use a sealed class, and make sure the output is a WINMD.
public sealed class UpdateBackgroundTask : IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
var deferral = taskInstance.GetDeferral();
try { ... } finally { deferral.Complete(); }
}
}
}
这里有一些关于我的声明的细节。