2013-02-20 4 views
3

Я пытаюсь понять, почему фоновый набор не запускается, но я понятия не имею, что я делаю неправильно.Фоновая задача не запускается

Что я пытаюсь сделать: я хочу иметь автоматическую фоновую задачу, которая будет загружать 5 последних элементов через WebApi (данные составляют пару kB). После загрузки он проверит локальный файл, чтобы узнать, есть ли новые элементы. Если это так, я хочу создать значок в LiveTile с количеством новых элементов.

У меня есть следующий код:

private BackgroundTaskRegistration ScheduleBackgroundTask() 
{ 
    foreach (var cur in BackgroundTaskRegistration.AllTasks) 
    { 
     if (cur.Value.Name == "TimeTriggeredTask") 
     { 
      return (BackgroundTaskRegistration)(cur.Value); 
     } 
    } 

    var builder = new BackgroundTaskBuilder(); 

    builder.Name = "TimeTriggeredTask"; 
    builder.TaskEntryPoint = "Tasks.UpdateItemTask"; 
    builder.SetTrigger(new MaintenanceTrigger(15, false)); 
    builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable)); 
    builder.AddCondition(new SystemCondition(SystemConditionType.UserNotPresent)); 

    BackgroundTaskRegistration task = builder.Register(); 
    return task; 
} 

И моя работа выглядит следующим образом:

namespace Tasks 
{ 
    public sealed class UpdateItemTask : IBackgroundTask 
    { 
     public async void Run(IBackgroundTaskInstance taskInstance) 
     { 
      Debug.WriteLine("Starting"); 

      BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); 

      DataHandler dataHandler = new DataHandler(); 
      BindableCollection<GeekAndPokeItemViewModel> latestItemsOnline = await dataHandler.GetData("10"); 
      BindableCollection<GeekAndPokeItemViewModel> latestItemsLocal = await dataHandler.GetLocalData(); 

      int difference = latestItemsOnline.Except(latestItemsLocal).Count(); 

      if (difference > 0) 
      { 
       BadgeUpdateManager.CreateBadgeUpdaterForApplication().Clear(); 
       BadgeNumericNotificationContent badgeContent = new BadgeNumericNotificationContent((uint)difference); 

       // send the notification to the app's application tile 
       BadgeUpdateManager.CreateBadgeUpdaterForApplication().Update(badgeContent.CreateNotification()); 
      } 

      _deferral.Complete(); 
     } 
    } 
} 

В моем appmanifest backgroundTask удлиняются с «таймером» задач и с правильной точкой входа.

Весь код находится в 1 проекте.

Даже с отладчиком прилагается (отлаживать программу без запуска приложения, и сила огня задание), оно не ударил мою задачу (или контрольную точку) и в EventViewer это дает результат:

Фоновая задача с точкой входа Tasks.UpdateItemTask и имя TimeTriggeredTask не удалось активировать с кодом ошибки 0x80010008.

Я проверял The samples of MS background Tasks, но даже те, кто не помогает. Я бы предположил, что это не так сложно, но я не могу заставить его работать.

+0

может быть просто сообщение о регистрации в вашей задаче, чтобы узнать, не может ли он его просто найти. – Dreamwalker

+0

Отладчик работает без проблем, только он не попадает в точку останова при запуске задачи, а это значит, что задача даже не запущена ... Я бы сказал, что запись в задание не поможет, поскольку задача не выполняется вообще ... –

+0

Я только что прочитал [документ] (http://www.microsoft.com/en-us/download/details.aspx?id=27411) о категории триггера обслуживания , Этот триггер - фактически SystemTrigger, а не TimeTrigger (определенный в моем appmanifest). Я изменил это, но все равно никакого результата. У меня все еще такое же сообщение об ошибке ... –

ответ

6

Я, наконец, получил это!

Во-первых: Я переместил Задачи в новую сборку в виде компонента компонента Windows RT и добавил ссылку в свое приложение WinRT.

Во-вторых: у меня была функция BackgroundTaskRegistration и UpdateItemTask в 1 cs-файле, причем только задача была запечатана. Мне нужно было установить BackgroundTaskRegistration также как запечатанный, чтобы скомпилировать. Как только я заставляю стрелять триггером, он, наконец, попадает в точку останова ...