应用程序关闭时的 UWP 进程内后台任务

UWP in-process background task when app is closed

通过 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();
}

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

Does the in-process background task, defined via the OnBackgroundActivated method, run even if the main application is closed or suspended

in-process background taskIn-process的定义得出:应用程序及其后台进程运行在相同的进程。因此,如果您的应用关闭,in-process 后台任务将终止。

In summary, if you need to create a background task that should run even if the main app is not open, can this be done with an in-process background task, or must an out-of-process background task be used?

请注意,如果 运行 超过了执行时间限制,即使 运行 在应用程序的前台进程中运行,后台 activity 也可以终止。出于某些目的,将工作分离到 运行 单独进程中的后台任务的弹性仍然有用。将后台工作作为与前台应用程序分开的任务可能是不需要与前台应用程序通信的工作的最佳选择。

对于您的场景,out-of-process 后台任务是更好的选择。

事实证明,与居高临下的微软员工提供的答案相反,如果应用程序关闭,后台任务将 运行,即使它是作为 in-process 后台任务实现的。

如果后台任务作为 in-process 任务实现,则 OnBackgroundActivated 方法将用作入口点,以防应用不是 运行ning。否则,将在应用 运行ning 时调用该方法。

后台任务启动有问题的原因是我在任务上使用了一个条件(即SystemConditionType.UserPresent)。这表现得非常不可预测。但是,我测试了(通过等待几次调用)in-process 和 out-of-process 方法,并且在这两种情况下任务都得到 运行,即使应用程序已关闭。

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

总而言之,在撰写本文时 post(2020 年 10 月 17 日),文档并未明确解释此行为,讽刺的是,上述居高临下的误解仅证明了这一点.