UWP выполнить backgroundtask при входе пользователя
Я изучаю win10 uwp, и моя цель - выполнить операцию, например обновить плитку, когда пользователь входит в систему.
Я проверил на MSDN и кажется, что мне нужна BackgroundTask. Поэтому я следовал инструкциям по созданию и регистрации фоновой задачи, найденной здесь https://msdn.microsoft.com/en-us/library/windows/apps/mt299100.aspx и на связанных страницах.
BackgroundTaskBuilder taskBuilder= new BackgroundTaskBuilder();
taskBuilder.Name = "TaskClassName";
taskBuilder.TaskEntryPoint = "TaskNameSpace.TaskClassName";
// set conditions (execute when user become present)
taskBuilder.SetTrigger(new SystemTrigger(SystemTriggerType.SessionConnected, false));
taskBuilder.SetTrigger(new SystemTrigger(SystemTriggerType.UserPresent, false));
var registration= taskBuilder.Register();
Пространство имен и класс моего BackgroundTask
помещаются в отдельный проект под тем же решением и добавляются во вкладку "Объявление" Package.appxmanifest со свойством System Event
выбран.
мой IBackgroundTask
реализация
public void Run(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
UpdateMyTile();
deferral.Complete();
}
При отладке в Visual Studio код запускает correclty и обновляет плитки, поэтому я думаю, что моя проблема в том, как я зарегистрировал задачу, а не в ее реализации.
Чтобы быть уверенным, я добавил вторую BackgroundTask
в существующий проект, который вызывается на основе таймера каждые 15 минут и выполняет те же функции. Во втором случае фоновая задача регистрируется и выполняется как ожидается.
BackgroundTaskBuilder taskBuilderT= new BackgroundTaskBuilder();
taskBuilderT.Name = "TaskClassNameTimer";
taskBuilderT.TaskEntryPoint = "TaskNameSpace.TaskClassNameTimer";
taskBuilderT.SetTrigger(new TimeTrigger(15, false));
var registration= taskBuilderT.Register();
Я также пытался использовать только один SystemTrigger
сначала с UserPresent
а затем с SessionConnected
безуспешно.
Обновление 27/01/2016
@Jakie: нет, я не использовал BackgroundExecutionManager.RequestAccessAsync();
потому что на https://msdn.microsoft.com/EN-US/library/windows/apps/windows.applicationmodel.background.systemtriggertype.aspx для SessionConnected и UserPresent говорится
Windows 10, Windows Server 2016 Technical Preview и Windows 10 Mobile: вам не нужно размещать приложение на экране блокировки, прежде чем приложение сможет успешно зарегистрировать фоновые задачи с использованием этого типа триггера.
Я собираюсь попробовать это, чтобы видеть, изменяет ли это текущее поведение. Я добавил вызов BackgroundExecutionManager.RequestAccessAsync();
с использованием windows 10 диалог не отображался, но вернулся AllowedMayUseActiveRealTimeConnectivity
но задача не была вызвана при входе в систему после перезагрузки.
Я запустил диагностический журнал и нашел события, относящиеся к моей фоновой задаче, он правильно зарегистрирован, но затем отменяется. В отчетах о событиях указывается eventID 19 Задача 100. Я не знаю, где искать информацию о значении этих кодов, есть предложения?
1 ответ
Мне наконец удалось успешно обновить плитку при входе пользователя. В дополнение к операциям, уже описанным в моем вопросе, я переместил метод регистрации задач в тот же проект, в котором объявлен класс фоновых задач.
Я создал класс, содержащий метод регистрации BackgroundRegistration
класс должен быть sealed
, Я объявил метод регистрации как static
но это не является строго необходимым.
Я также успешно запустил мою фоновую задачу при входе в систему при запуске только тогда, когда все методы вызваны IBackgroundTask run
Реализация метода была включена в проект с заданием фона, а используемые классы были sealed
, Во всех других случаях я обнаружил, что моя фоновая задача всегда возвращала ошибку 0x80010008, которая в MS-ERREF описывается как:
Абонент (клиент) исчез, когда вызываемый абонент (сервер) обрабатывал вызов.