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

C# 应用程序关闭时的UWP进程内后台任务,c#,uwp,background-process,background-task,out-of-process,C#,Uwp,Background Process,Background Task,Out Of Process,通过OnBackgroundActivated方法定义的进程内后台任务是否在主应用程序关闭或挂起时运行,或者我必须执行进程外后台任务 文件对此并不清楚 我以前写过进程外的后台任务,即使应用程序未运行,它们也会运行。然而,在我看来,除非应用程序处于活动状态,否则进程内后台任务不会运行。正如文档中建议的那样,我使用了延迟来避免任务关闭,并且在注册任务时,我将oneShot设置为false。此任务所需时间不超过10秒。任务已注册,可以从VisualStudio手动运行,但如果应用程序已关闭,

通过
OnBackgroundActivated
方法定义的进程内后台任务是否在主应用程序关闭或挂起时运行,或者我必须执行进程外后台任务

文件对此并不清楚

我以前写过进程外的后台任务,即使应用程序未运行,它们也会运行。然而,在我看来,除非应用程序处于活动状态,否则进程内后台任务不会运行。正如文档中建议的那样,我使用了延迟来避免任务关闭,并且在注册任务时,我将
oneShot
设置为
false
。此任务所需时间不超过10秒。任务已注册,可以从VisualStudio手动运行,但如果应用程序已关闭,任务似乎不会自动运行

protected async override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
    base.OnBackgroundActivated(args);
    IBackgroundTaskInstance taskInstance = args.TaskInstance;
    BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
    await RunBackgroundWork();
    deferral.Complete();
}
总之,如果您需要创建即使主应用程序未打开也应运行的后台任务,那么这可以通过进程内后台任务完成,还是必须使用进程外后台任务

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

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

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

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


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

事实证明,与谦逊的Microsoft员工提供的答案相反,如果关闭应用程序,后台任务将运行,即使它是作为进程内后台任务实现的

如果后台任务作为进程内任务执行,则在应用程序未运行的情况下,
OnBackgroundActivated
方法将用作入口点。否则,将在应用程序运行时调用该方法

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

protected async override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
    base.OnBackgroundActivated(args);
    IBackgroundTaskInstance taskInstance = args.TaskInstance;
    BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
    await RunBackgroundWork();
    deferral.Complete();
}
如果使用任务延迟,即使用户关闭应用程序,后台任务也不应终止


总之,在写这篇文章时(2020年10月17日),文档并没有清楚地解释这一行为和前述的屈尊曲解,讽刺的是,微软自己的员工只是证明了这一点。

这是真的,但不清楚运行时为什么不激活应用程序(如果应用程序已关闭,请运行新流程)以
OnBackgroundActivated
方法作为入口点。我仍然不清楚是否有必要执行进程外任务,即使在应用程序关闭或挂起时,它是否应在计时器上运行。后台任务位于同一进程中的事实并不排除进程仅可用于如果需要,可以使用y来主持后台任务。