2016-10-07 2 views
0

Я несколько секунд стучал головой о монитор. Я разрабатываю приложение UWP для Windows Store (таргетинг 14393), и я использую рамки Prism/Unity для MVVM/IoC.TimeTrigger не срабатывает в однопроцессорном сценарии UWP

Поскольку данные, необходимые для обновления Live Tile, хранятся в классе, реализующем шаблон хранилища, и все управляется через Unity, я не создаю отдельный процесс для выполнения фона, поэтому даже упрощает весь процесс регистрации BGTask.

Фактический регистрационный код BGTask выглядит следующим образом:

var servicingTaskAlreadyRegistered = false; 
var tileUpdaterTaskAlreadyRegistered = false; 

foreach (var t in BackgroundTaskRegistration.AllTasks) 
{ 
    if (t.Value.Name == Constants.BgTileUpdaterTaskName) 
     tileUpdaterTaskAlreadyRegistered = true; 
    else if (t.Value.Name.Equals(Constants.BgServicingTaskName)) 
     servicingTaskAlreadyRegistered = true; 
} 

var reqAccess = await BackgroundExecutionManager.RequestAccessAsync(); 
if (reqAccess == BackgroundAccessStatus.Denied || 
    reqAccess == BackgroundAccessStatus.DeniedBySystemPolicy || 
    reqAccess == BackgroundAccessStatus.DeniedByUser || 
    reqAccess == BackgroundAccessStatus.Unspecified) 
    return false; 

if (!servicingTaskAlreadyRegistered) 
{ 
    var servicingTaskBuilder = new BackgroundTaskBuilder(); 
    servicingTaskBuilder.Name = Constants.BgServicingTaskName; 
    servicingTaskBuilder.SetTrigger(new SystemTrigger(SystemTriggerType.ServicingComplete, false)); 
    servicingTaskBuilder.Register(); 
} 

if (tileUpdaterTaskAlreadyRegistered) 
    return true; 

var builder = new BackgroundTaskBuilder(); 
builder.Name = Constants.BgTileUpdaterTaskName; 
builder.SetTrigger(new TimeTrigger(TileUpdateFrequencyMinutes, false)); 
//builder.SetTrigger(new MaintenanceTrigger(TileUpdateFrequencyMinutes, false)); 
builder.IsNetworkRequested = true; 

builder.Register(); 

Регистрация успешно завершена. Выполнение Get-AppBackgroundTask в PowerShell показывает обе задачи, как и должно быть. Однако TimeTrigger никогда не срабатывает. Переключение TimeTrigger с MaintenanceTrigger устраняет проблему, хотя смартфон необходимо подключить к зарядному устройству, которое не является приемлемым решением.

Выполнение задачи, выполняемой через VisualStudio или PowerShell (Start-AppBackgroundTask -TaskID), выполняется правильно, а плитка обновляется.

Есть ли у вас другой полезный отзыв?

Редактировать 12/01/2017 Я создал REPRO, содержащий Visual Studio Solution с двумя проектами:

  • Живой Test Tile Простые: так просто, как это добирается, чтобы иметь обновление живой плитки каждые 15 минут с использованием UWP. Все работает так, как ожидалось.
  • Призматический тест в реальном времени: снова, простое преобразование вышеупомянутого проекта с использованием Prism и Unity. Не работает, потому что, когда ОС пытается запустить приложение для обновления плитки, контейнер Unity имеет значение null (не инициализируется).

Это объясняет, почему у меня возникла проблема: Unity не инициализируется, я не могу получить данные через репозитории, сбой приложений и GG.

Теперь мне просто нужно понять, почему Unity недоступен в методе OnBackgroundActivated. Почти там ребята !!

Репро: https://github.com/eraser85/LiveTileTestRepro

ответ

0

ИТАК еще после некоторых тестов я наконец-то придумать решение.

Как уже упоминалось, проблема возникла из Prism: в основном при запуске ОС и ввода через OnBackgroundActivated() контейнер IoC не инициализировался.

Решение, даже если кажется hack-ish, на самом деле является абсолютно жизнеспособным и правильным (IMHO!).В вашем OnBackgroundActivated() просто инициализируйте все, как если бы начиналось с нуля (посмотрите на Prism's Source для деталей реализации): в моем конкретном случае я только что позвонил CreateAndConfigureContainer() и перерегистрировал все, что я положил в OnInitializeAsync() (например, repos, services ..).

У меня есть opened an issue с разработчиками. Возможно, решение уже в пути, но в то же время это должно сделать.

0

Код выглядит хорошо для меня, единственное, что я бы попытаться изменить здесь использование IsNetwokRequested собственности и значения TimeTrigger частоты, вы уверены, что постоянная/переменная, которую» re использование больше или равно 15?

Вот пример:

BackgroundTaskBuilder builder = new BackgroundTaskBuilder { Name = "YourBgTaskName" }; 
builder.SetTrigger(new TimeTrigger(15, false)); 
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable)); 
builder.Register(); 
+0

Что касается этой переменной, это простой 'private const int TileUpdateFrequencyMinutes = 15;'. Я положил его за переменную, если бы захотел показать это значение на странице настроек. Но да, я уверен, что это 15 минут (я только что проверил ваш совет! :)). Что касается IsNetworkRequired, то в течение нескольких месяцев после моего сообщения я читал в Интернете те же самые проблемы, о которых вы упоминаете, и давно обновил код, и он в основном такой же, как тот, который вы предлагаете. К сожалению, у меня все еще есть проблемы. В любом случае, спасибо! – MicheleM

+0

@ MicheleM Попробовали ли вы создать новое решение с другим проектом UWP, содержащим пустое приложение, которое настраивает и запускает фоновое задание с одним процессом, чтобы увидеть, работает ли оно там? Таким образом, вы, по крайней мере, сможете понять, что-то не так с вашим проектом приложения, в частности, с установкой VS или системными настройками или что-то еще. Я имею в виду, что ваш код с дополнительными изменениями, которые вы упомянули, выглядит на 100% прав для меня. – Sergio0694

+0

Нет, еще нет. Полагаю, это единственный способ на этом этапе. Я собираюсь сделать два новых проекта, стандартный пустой проект с минимальным обновлением живой плитки, а другой с призмой, запеченной в: Я подозреваю, что проблема, с которой я связан, связана с ней каким-то образом. Спасибо, сейчас я обновляю этот пост, как только у меня есть что-то. – MicheleM

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