2

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

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

4

2 回答 2

1

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

源自in-process background task In-process的定义:app和它的后台进程运行在同一个进程中。因此,如果您的应用程序关闭,则正在进行的后台任务将被终止。

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

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

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

于 2020-10-15T11:26:30.147 回答
0

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

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

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

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

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

于 2020-10-17T20:05:06.077 回答