代码之家  ›  专栏  ›  技术社区  ›  Mathias Lykkegaard Lorenzen

HttpClient.GetAsync在后台任务中失败,具有锁定屏幕访问和TimeTrigger或MaintenanceTrigger

  •  2
  • Mathias Lykkegaard Lorenzen  · 技术社区  · 12 年前

    Client.GetAsync在我的Windows 8 Metro应用程序的后台任务中运行时对我来说似乎失败了。

    我尝试同时使用TimeTrigger和MaintenanceTrigger。看来也不例外。当调试它时,它只会在那一行退出(如果我一直按step over),尽管还有很多事情要执行,还有一个try-catch。

    这使我相信Windows正在取消我的任务。所以我听了取消的活动,但运气不佳。

    我已经宣布互联网接入是一种能力,并且该任务已经正确注册。此外,我的应用程序可以完全锁定屏幕访问。

    我做错了什么?

    这是我当前用于注册后台任务的代码。

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

    以下是我申报的一些细节。

    enter image description here

    1 回复  |  直到 12 年前
        1
  •  2
  •   Jonny Lin    12 年前

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

    代码:

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