UWP — фоновая задача — короткий интервал

Я разрабатываю приложение UWP, и мне нужно отправлять свое местоположение каждые 15 секунд, если текущее состояние приложения активно или приостановлено. Я пробовал два разных подхода:

await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
        {
            await UpdateMethod(data);
        });

и

var taskResult = await backgroundTrigger.RequestAsync(taskParameters);
  1. Расширенное выполнение

    • works fine when application is active
    • когда приложение приостановлено Диспетчер недоступен
  2. ExtendedExecution + фоновая задача + триггер приложения

    • it works fine when app is active
    • когда приложение приостановлено, я продолжаю получать ApplicationTriggerResult.DisabledByPolicy после вызова метода выше

person lijevosmetalo    schedule 03.11.2016    source источник


Ответы (1)


когда приложение приостановлено Диспетчер недоступен

Я протестировал официальный образец ExtendedExecution на своей стороне, Dispatcher работало хорошо после приостановки приложения, если ExtendedExecutionSession был успешно запрошен. Моя среда — Windows 10 build 14393, и я протестировал эту функцию на ПК.

Мне нужно отправлять свое местоположение каждые 15 секунд

Для ваших требований LocationTracking Рекомендуется использовать ExtendedExecutionReason. сценарий 3 из официальный образец реализовал ту же функцию, что и вы, вы можете ссылаться.

когда приложение приостановлено, я продолжаю получать ApplicationTriggerResult.DisabledByPolicy после вызова метода выше

По официальному образцу ExtendExcution уже соответствуют вашим требованиям. Для триггера приложения, насколько мне известно, его нельзя запросить из потока пользовательского интерфейса.

Кроме того, ExtendExcution может поддерживать работу вашего приложения в течение дополнительных 10 минут после приостановки работы, если к устройству не подключено питание. Дополнительные сведения см. в этом видео.

person Sunteen Wu    schedule 04.11.2016
comment
private async void Sync(object sync) { var data = sync as string; if (data != null) { await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { await _dl.UpdateLocation(data); // breakpoint at this line never gets hit }); } Пробовал на 2 планшетах, ПК (10586 и 14393), не работает. Я использую ExtendedExecutionReason.LocationTracking. - person lijevosmetalo; 04.11.2016
comment
@lijevosmetalo Я протестировал официальный образец на 14393, он работает. Пожалуйста, также протестируйте сценарий 3 и следуйте официальному образцу, чтобы исправить свой код. Я не могу помочь решить вашу проблему только одной строкой кода. Если у вас все еще есть проблемы, пожалуйста, загрузите весь проект воспроизведения, чтобы мы могли вам помочь. - person Sunteen Wu; 08.11.2016
comment
Официальный образец мне не подходит. Попробуйте сценарий 3 и поставьте точку останова на строку 140 (или на любую строку между 140 и 159). Запустите сценарий, а затем приостановите приложение из VS. Сценарий 1, который не использует Dispatcher в методе OnTimer, работает нормально, а сценарий 3 — нет. - person lijevosmetalo; 08.11.2016
comment
@lijevosmetalo, если вы попробовали официальный образец на другой машине, вы можете получить такое же исключение? - person Sunteen Wu; 09.11.2016
comment
Привет, нет, я не могу получить никаких исключений. Кроме того, сценарий 3 работает в одной трети ситуаций и НИКОГДА не работает, когда я нажимаю кнопку питания на своем планшете или переключаюсь на приложение, отличное от UWP. - person lijevosmetalo; 21.02.2017