问题描述
通过OnBackgroundActivated
方法定义的进程内后台任务是否可以运行,即使主应用程序已关闭或挂起,还是必须执行进程外后台任务?
文档尚不清楚。
- Support your app with background tasks
- Create and register an out-of-process background task
- Create and register an in-process background task
我之前已经编写了进程外后台任务,这些任务即使在应用程序未运行时也可以运行。但是,在我看来,除非应用程序处于活动状态,否则进程中的后台任务将不会运行。我已经按照文档中的建议使用了延迟,以避免任务被关闭,并且在注册任务时将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日),文档没有清楚地解释这种行为,并且讽刺的是,微软自己的雇员仅是证明了这一点,上述提到的屈服于误解。