2

在我的 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(); }

        }
     }

}

这里有一些关于我的声明的细节。

在此处输入图像描述

4

1 回答 1

2

我之前遇到过类似的问题,我解决它的方法是在异步任务中再次延迟。我认为这个想法是,每当您有异步任务时,您都需要延迟。(我不确定这是否是最佳做法,但嘿,它有效)

代码:

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        updateAllTiles(taskInstance);
    }


    public async void updateAllTiles(IBackgroundTaskInstance taskInstance)
    {
        // Need to use a deferral to run async tasks in the background task
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

        dosomething(taskInstance);

        deferral.Complete();
    }

    private async void dosomething(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

        HttpClient client = new HttpClient();
        HttpResponseMessage resp = await client.GetAsync(new Uri(url));

        updateTile(resp);

        deferral.Complete();
    }
于 2012-11-07T11:44:37.377 回答