应用程序关闭时的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();
}

总之,如果你需要创建一个后台任务,即使主应用程序没有打开,也应该运行,这可以通过进程中的后台任务来完成,还是必须使用进程外的后台任务?

即使主应用程序关闭或挂起,通过OnBackgroundActivated方法定义的进程内后台任务是否也会运行

源自in-process background task进程中的定义:应用程序及其后台进程在同一进程中运行。因此,如果你的应用程序关闭,进程中的后台任务将被终止。

总之,如果您需要创建一个即使主应用程序未打开也应运行的后台任务,这可以通过进程内后台任务来完成,还是必须使用进程外后台任务?

请注意,即使在应用程序的前台进程内运行,如果超过执行时间限制,后台活动也可能终止。出于某些目的,将工作分离为在单独流程中运行的后台任务的弹性仍然很有用。对于不需要与前台应用程序通信的工作来说,将后台工作作为与前台应用软件分离的任务可能是最好的选择。

对于您的场景,进程外后台任务是更好的选择。

事实证明,与这位屈尊俯就的微软员工提供的答案相反,如果应用程序关闭,即使它被实现为进程中的后台任务,后台任务也会运行。

如果后台任务被实现为进程中任务,那么OnBackgroundActivated方法将被用作入口点,以防应用程序未运行。否则,将在应用程序运行时调用该方法。

后台任务启动出现问题的原因是我在任务上使用了一个条件(即SystemConditionType.UserPresent(。这种行为非常不可预测。然而,我测试了(通过等待几个调用(进程内和进程外方法,即使应用程序关闭,任务也会在这两种情况下运行。

如果使用任务延期,即使用户关闭应用程序,也不应终止后台任务。

总之,在撰写本文时(2020年10月17日(,文档并没有清楚地解释这种行为,具有讽刺意味的是,微软自己的员工对上述屈尊俯就的误解只证明了这一点。

最新更新