Фоновая задача UWP в процессе, когда приложение закрыто

#c# #uwp #background-process #background-task #out-of-process

#c# #uwp #фоновый процесс #фоновая задача #вне процесса

Вопрос:

Выполняется ли фоновая задача в процессе, определенная с помощью OnBackgroundActivated метода, даже если основное приложение закрыто или приостановлено, или я должен реализовать фоновую задачу вне процесса?

В документации это неясно.

Я уже писал фоновые задачи вне процесса, и они выполняются, даже если приложение не работает. Однако мне кажется, что фоновая задача в процессе не будет выполняться, если приложение не активно. Я использовал отсрочку, как предложено в документации, чтобы избежать закрытия задачи, и я установил значение oneShot false при регистрации задачи. Задача занимает не более 10 секунд. Задача зарегистрирована и может быть запущена вручную из Visual Studio, но, похоже, не запускается автоматически, если приложение закрыто.

 protected async override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
    base.OnBackgroundActivated(args);
    IBackgroundTaskInstance taskInstance = args.TaskInstance;
    BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
    await RunBackgroundWork();
    deferral.Complete();
}
  

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

Ответ №1:

Выполняется ли фоновая задача в процессе, определенная с помощью метода OnBackgroundActivated, даже если основное приложение закрыто или приостановлено

Вытекает из определения in-process background task In-process: приложение и его фоновый процесс выполняются в одном процессе. Поэтому, если ваше приложение закрыто, фоновая задача в процессе будет завершена.

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

Имейте в виду, что фоновая активность может быть прекращена даже при запуске внутри процесса переднего плана приложения, если он выполняется за пределами времени выполнения. ограничения. Для некоторых целей все еще полезна отказоустойчивость разделения работы на фоновую задачу, которая выполняется в отдельном процессе. Сохранение фоновой работы в качестве задачи отдельно от приложения переднего плана может быть лучшим вариантом для работы, которая не требует взаимодействия с приложением переднего плана.

Для вашего сценария фоновая задача вне процесса — лучший выбор.

Комментарии:

1. Это правда, но неясно, почему среда выполнения не активирует приложение (запускает новый процесс в случае, если приложение закрыто) с OnBackgroundActivated помощью метода в качестве точки входа. Мне все еще неясно, нужно ли реализовывать внепроцессную задачу, если она должна выполняться по таймеру, даже когда приложение закрыто или приостановлено. Тот факт, что фоновая задача находится в том же процессе, не исключает возможности того, что процесс может использоваться только для размещения фоновой задачи, если в этом есть необходимость.

Ответ №2:

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

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

Причина, по которой возникли проблемы с запуском фоновой задачи, заключалась в том, что я использовал условие (а именно SystemConditionType.UserPresent ) для задачи. Это ведет себя очень непредсказуемо. Тем не менее, я протестировал (ожидая нескольких вызовов) как внутрипроцессный, так и внепроцессный подход, и задача запускается в обоих случаях, даже если приложение закрыто.

Если используется отсрочка выполнения задачи, фоновая задача не должна завершаться, даже если пользователь закрывает приложение.

В заключение, на момент написания этого сообщения (17 октября 2020 г.) в документации четко не объясняется это поведение, и вышеупомянутое снисходительное неправильное толкование, по иронии судьбы, собственным сотрудником Microsoft, только подтверждает это.