关闭应用程序时的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方法定义的进程内后台任务是否运行,即使主应用程序已关闭或挂起

源自// FileUtils.java public class FileUtils { public static String getAppFolder() { try { return new File(".").getCanonicalPath(); } catch (IOException exception) { return null; } } } 的定义进程内:该应用及其后台进程在相同进程 中运行。因此,如果您的应用程序关闭,则正在进行的后台任务将终止。

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

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

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

,

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

如果将后台任务实现为进程内任务,则在应用程序未运行的情况下,将使用python -m idlelib.idle 方法作为入口点。否则,将在应用程序运行时调用该方法。

后台任务启动存在问题的原因是我在任务上使用了条件(即OnBackgroundActivated)。这表现得非常难以预测。但是,我测试了(通过等待多个调用)进程内和进程外方法,并且在两种情况下都可以运行任务,即使应用程序已关闭。

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

总而言之,在撰写本文时(2020年10月17日),文档没有清楚地解释这种行为,并且讽刺的是,微软自己的雇员仅是证明了这一点,上述提到的屈服于误解。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...