2016-10-06 7 views
0

Я пытаюсь настроить фоновое задание для запуска каждые 15 минут с моего приложения UWP, но, несмотря на успешное регистрацию приложения, он не запускается , Там есть тонны материала, чтобы быстро подвести итог тому, что я сделал до сих пор:Фоновая задача в UWP - TimeTrigger и SystemTrigger регистрируют нулевое значение в builder.SetTrigger

  1. Создан компонент компонента Windows Runtime Component.
  2. Добавлен BackgroundSync.cs, реализующий IBackgroundTask.
  3. Ссылка на проект WinRT из моего проекта пользовательского интерфейса.
  4. Зарегистрированная фоновая задача в пакете .appmanifest, включая отметки триггеров событий Timer и System.
  5. Registered BackgroundSync в App.xaml.cs, код ниже.
  6. Проверено, что BackgroundSync является зарегистрированной фоновой задачей в Powershell.
  7. Я вручную вызвал задачу BackgroundSync в отладке> События жизненного цикла.

Вот мой код, чтобы зарегистрировать задачу:

private static async Task<BackgroundTaskRegistration> SetupBackgroundSync() 
    { 
     await BackgroundExecutionManager.RequestAccessAsync(); 

     var builder = new BackgroundTaskBuilder(); 

     var TaskName = "BackgroundSync"; 

     foreach (var t in BackgroundTaskRegistration.AllTasks) 
     { 
      if (t.Value.Name == TaskName) 
      { 
       t.Value.Unregister(true); 
      } 
     } 

     builder.Name = TaskName; 
     builder.TaskEntryPoint = typeof(Background.BackgroundSync).FullName; 
     builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable)); 

     builder.SetTrigger(new TimeTrigger(15, false)); 

     BackgroundTaskRegistration task = builder.Register(); 

     return task; 
    } 

Единственная проблема, которую я могу определить, является то, что на создание BackgroundTaskRegistration объекта я могу видеть, что триггер является недействительным. Это показывает нулевой и триггерный тип, отличный от ApplicationTrigger.

Я видел сообщение here, в котором принимается плакат, ответ которого утверждается, что это нулевое отображение в объекте задачи ожидается, однако предлагаемое решение не помогло.

Стоит также заявить, что при запуске RequestAccessAsync() значение, которое я возвращаю, фактически составляет BackgroundAccessStatus.AllowedSubjectToSystemPolicy, которое, как я считаю, должно иметь последствия. Я видел в некоторых местах, что RequestAccessAsync() должен вызываться из потока пользовательского интерфейса, и я вызываю это из App.xaml.cs, прежде чем регистрировать свои задачи.

Есть ли у кого-нибудь другие идеи о потенциальных причинах этого?

Update 07-10

код в моем тестовом проекте для этого фона вопрос задачи:

RegistrationHelper.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.ApplicationModel.Background; 

namespace Tasks 
{ 
    public sealed class RegistrationHelper 
    { 

     public async Task<BackgroundTaskRegistration> RegisterTasks() 
     { 
      //Returns AllowedSubjectToSystemPolicy 
      await BackgroundExecutionManager.RequestAccessAsync(); 

      var builder = new BackgroundTaskBuilder(); 

      var TaskName = "BackgroundTask1"; 

      foreach (var t in BackgroundTaskRegistration.AllTasks) 
      { 
       if (t.Value.Name == TaskName) 
       { 
        t.Value.Unregister(true); 
       } 
      } 

      builder.Name = TaskName; 
      builder.TaskEntryPoint = typeof(BackgroundTask1).FullName; 
      builder.AddCondition(new  SystemCondition(SystemConditionType.InternetAvailable)); 

      builder.SetTrigger(new TimeTrigger(15, false)); 

      BackgroundTaskRegistration task = builder.Register(); 

      return task; 

     } 

    } 
} 

Вызывается в моем App.xaml.cs здесь.

public App() 
    { 
     this.InitializeComponent(); 
     this.Suspending += OnSuspending; 

     Tasks.RegistrationHelper registrationhelper = new Tasks.RegistrationHelper(); 

     var task = registrationhelper.RegisterTasks(); 
    } 

Мой фон задача: структура

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.ApplicationModel.Background; 

namespace Tasks 
{ 
    public sealed class BackgroundTask1 : IBackgroundTask 
    { 

     public void Run(IBackgroundTaskInstance taskInstance) 
     { 

      while (true) { } 

     } 

    } 
} 

Solution. BackgroundTaskTest - это приложение UWP Blank.Задачи являются UWP среды выполнения Windows Компонент:

Solution structure. BackgroundTaskTest is UWP Blank app. Tasks is a UWP Windows Runtime Component.

И, наконец, мой PackageManifest:

<Extensions> 
    <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.BackgroundTask1"> 
     <BackgroundTasks> 
     <Task Type="systemEvent" /> 
     <Task Type="timer" /> 
     </BackgroundTasks> 
    </Extension> 
    </Extensions> 
+0

Я собирался опубликовать тот же вопрос. Мой TimeTrigger также отлично зарекомендовал себя, но не срабатывает. Ждем ответа. – AVK

+0

Пальцы скрещены ... Ваш триггер также отображается как нулевой в вашем отладчике? – JonnyKnottsvill

+0

да. Его либо мы что-то упускаем в документации, либо документация не обновлена ​​или не хватает нескольких шагов. – AVK

ответ

0

Это может быть не для вас решения, но, иногда, мое TimeTrigger задача также не начинается и в этом случае помогает следующие шаги

  1. Отключение доступа Предыстория приложение в окна настройки
  2. Restart PC
  3. разрешить доступ
  4. Start приложение для регистрации фоновых задач

Кроме того, ваш предоставляется код имеет несколько проблемных моментов, которые могли бы вызвать проблемы

  1. Регистрация фоновых задач внутри приложения. xaml.cs. Лучшее место для загрузки Loaded event-обработчик главного приложения Page
  2. «while (true) {}» внутри внутренней задачи, замените его, например, простым уведомлением о тосте, для вас было бы намного проще проверить запуск задачи время
  3. Там нет необходимости отменить задание, если он уже зарегистрирован только работать с имеющимися например