2013-09-24 2 views
0

В моих приложениях с Windows Phone 8 у меня есть задачи (LiveTiles и ToastNotifications). Я хочу, чтобы эти задачи выполнялись как периодические фоновые задачи. Задача уведомления о Toast запускается один раз в день, и моя задача LiveTiles запускается каждые 10 минут. Добавляя вторую периодическую задачу, она показывает ошибку (ошибка BNS: максимальное количество ScheduledActions этого типа уже добавлено). Любой, кто дал мне знать ответ, если у вас есть решение. Здесь я прикрепил код.Как выполнять две фоновые задачи периодически в приложениях wp8?

App.xaml.cs:

var LiveTilesName = "LiveTiles"; 
     var ToastNotificationsName = "ToastNotifications"; 

     PeriodicTask LiveTilesPeriodicTask = ScheduledActionService.Find(LiveTilesName) as PeriodicTask; 
     PeriodicTask ToastNotificationPeriodicTask = ScheduledActionService.Find(ToastNotificationsName) as PeriodicTask; 

     if (LiveTilesPeriodicTask != null) 
      ScheduledActionService.Remove(LiveTilesName); 

     if (ToastNotificationPeriodicTask != null) 
      ScheduledActionService.Remove(ToastNotificationsName); 

     LiveTilesPeriodicTask = new PeriodicTask(LiveTilesName) { Description = "Update Live Tiles." }; 
     ToastNotificationPeriodicTask = new PeriodicTask(ToastNotificationsName) { Description = "Toast Notifications" }; 

     try 
     { 
      ScheduledActionService.Add(LiveTilesPeriodicTask); 
      ScheduledActionService.LaunchForTest(LiveTilesName, TimeSpan.FromSeconds(10)); 

      ScheduledActionService.Add(ToastNotificationPeriodicTask); 
      ScheduledActionService.LaunchForTest(ToastNotificationsName, TimeSpan.FromSeconds(10)); 

     } 
     catch (InvalidOperationException e) { } 

SchedulerAgentTask Код:

protected override void OnInvoke(ScheduledTask task) 
    { 
     //ScheduledActionService.LaunchForTest("ToastNotifications", TimeSpan.FromSeconds(30)); 
     if (task.Name == "ToastNotifications") 
     { 
      SendNotifications();         
     } 
     else if(task.Name == "LiveTiles") 
     { 

      UpdateTiles();     
      ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(30)); 
     } 

     else{} 

     NotifyComplete(); 
    } 
+0

Не используйте LaunchForTest для версий версий. Приложения: http://blog.mjfnet.com/2013/01/10/windows-phone-dont-call-launchfortest-in-release/ – MikimotoH

ответ

3

Как вы обнаружили, что это возможно только, чтобы иметь одну фоновую задачу для приложения.

Однако, возможно, эта задача выполняет несколько функций. Если вы хотите, чтобы одно произошло только один раз в день, просто отслеживайте, если он был запущен в тот же день.

Следует также отметить, что выполнение задачи не возможно каждые 10 минут.
Запланированные задания выполняются примерно каждые 30 минут (обычно +/- 10 минут), и вы не можете контролировать время, которое они запускают. Они планируются ОС для оптимизации потребления батареи.

Если вы хотите, возможно, обновить свои плитки каждые 10 минут, вам нужно будет сделать это с помощью push-уведомлений.

+0

Спасибо Мэтту Лейси, я нашел решение. Я скоро загружу свой рабочий код. –

0

Я нашел решение для своего вопроса. Я добавил код. В моих App.xaml.cs файл У меня есть метод, называемый StartAgentTask(),

private void StartAgentTask() 
    { 
     var LiveTilesName = "LiveTiles"; 
     var ToastNotificationsName = "ToastNotifications"; 

     PeriodicTask LiveTilesPeriodicTask = ScheduledActionService.Find(LiveTilesName) as PeriodicTask; 
     ResourceIntensiveTask ToastNotificationResourceIntensiveTask = ScheduledActionService.Find(ToastNotificationsName) as ResourceIntensiveTask; 
     if (LiveTilesPeriodicTask != null) 
      ScheduledActionService.Remove(LiveTilesName); 

     if (ToastNotificationResourceIntensiveTask != null) 
      ScheduledActionService.Remove(ToastNotificationsName); 

     LiveTilesPeriodicTask = new PeriodicTask(LiveTilesName) { Description = "Update Live Tiles." }; 
     ToastNotificationResourceIntensiveTask = new ResourceIntensiveTask(ToastNotificationsName) { Description = "Toast Notifications" }; 

     try 
     { 
      ScheduledActionService.Add(LiveTilesPeriodicTask); 
      ScheduledActionService.LaunchForTest(LiveTilesName, TimeSpan.FromSeconds(10)); 

      ScheduledActionService.Add(ToastNotificationResourceIntensiveTask); 

      double seconds; 
      if (DateTime.Now.TimeOfDay <= new TimeSpan(8, 30, 00)) 
      { 
       seconds = 30600 - DateTime.Now.TimeOfDay.TotalSeconds; 
       //seconds = 38100 - DateTime.Now.TimeOfDay.TotalSeconds; 
      } 
      else 
      { 
       seconds = 117000 - DateTime.Now.TimeOfDay.TotalSeconds; 
       //seconds = 124500 - DateTime.Now.TimeOfDay.TotalSeconds; 
      } 

      ScheduledActionService.LaunchForTest(ToastNotificationsName, TimeSpan.FromSeconds(seconds)); 

     } 
     catch (InvalidOperationException e) { } 

    } 

В Мой Планировщик Агент класса У меня есть метод, называемый OnInvoke (ScheduledTask Task),

protected override void OnInvoke(ScheduledTask Task) 
    { 
     //ScheduledActionService.LaunchForTest("ToastNotifications", TimeSpan.FromSeconds(30)); 
     if (Task.Name == "ToastNotifications") 
     {        
      SendNotifications(); // To Call the SendNotification method and It'l be send the notification to the user at the specified time when the application is not running 
      double seconds; 
      if (DateTime.Now.TimeOfDay <= new TimeSpan(8, 30, 00)) 
      { 
       seconds = 30600 - DateTime.Now.TimeOfDay.TotalSeconds; 
       //seconds = 38100 - DateTime.Now.TimeOfDay.TotalSeconds; 
      } 
      else 
      { 
       seconds = 117000 - DateTime.Now.TimeOfDay.TotalSeconds; 
       //seconds = 124500 - DateTime.Now.TimeOfDay.TotalSeconds; 
      } 

      ScheduledActionService.LaunchForTest(Task.Name, TimeSpan.FromSeconds(seconds));    
     } 
     else if(Task.Name == "LiveTiles") 
     { 
      UpdateTiles(); // To Cal the UpdateTiles method and It'l update the current tile.    
      ScheduledActionService.LaunchForTest(Task.Name, TimeSpan.FromSeconds(30)); 
     } 

     else{} 

     NotifyComplete(); 
    } 

У меня есть для вызова первого метода из моего метода Application_Launching(). Итак, чтобы моя первая задача была запланирована на каждые 30 секунд, а моя вторая задача должна быть запланирована на @ 8.30 утра каждый день (из моего образца).

+1

Обратите внимание, что 'ScheduledActionService.LaunchForTest' может использоваться только в условиях DEBUG. Он не может использоваться в коде выпуска и не может использоваться в приложениях, отправленных в магазин. –

+0

Хорошо, Мэтт, тогда какое решение? пожалуйста, объясните в глубине, если у вас есть. –

+0

Вы в основном делаете то, что сделали, но должны полагаться на автоматическое планирование вызова вашего агента. «LaunchForTest» - это только вспомогательное тестирование вспомогательного метода. Это так, что вам не нужно ждать около 30 минут, чтобы проверить код агента. Если вы хотите чаще выполнять функции, вы не можете делать это на устройстве. –

Смежные вопросы