如何在应用程序启动时停止后台任务?
问题描述:
在我的应用程序中,应用程序和后台任务都会访问一个文件,并且首先打开文件,另一个将会失败。如何在应用程序启动时停止后台任务?
为了避免发生这种情况,我想在用户打开应用程序时停止后台任务,并且如果应用程序已经打开,则不要运行后台任务。
如何知道从后台任务,如果应用程序正在运行或不?以及如何在应用程序启动之前阻止它?谢谢。
我这是怎么注册的后台任务:
var result = await BackgroundExecutionManager.RequestAccessAsync();
var builder = new BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = taskEntryPoint;
builder.SetTrigger(trigger);
builder.AddCondition(condition);
BackgroundTaskRegistration task = builder.Register();
有一个UserNotPresent
condition指定用户,如果不存在该任务只能运行。但目前我不明白这意味着用户正在使用该应用程序或使用电话。
答
UserNotPresent条件表示用户当前未使用整个设备。
您的任务是进行中的后台任务还是进程外后台任务? 我建议使用进程内任务以避免困难的跨进程通信场景并简化项目结构。
返回确定是否一个应用程序从一个后台任务达的实际问题:
对于进程的任务,你可以检查应用程序的可见性状态,看它是否是在前台。这可以通过几种不同的方式完成:
- 在LeavingBackground中将IsInForeground标志设置为true,然后在EnteredBackground中将其设置为false。然后,您可以检查该标记以查看应用程序是否在前台运行。
- 使用窗口的可见性。使用CoreWindow.GetForCurrentThread()。Visible或Window.Current.Visible将使您能够查看应用程序是否在前台,最小化或在后台运行无头。在前景时都是如此,在最小化时为真。 CoreWindow.GetForCurrentThread()将返回null,并尝试访问Window.Current将在应用程序无头时引发异常。
对于进程外任务,您可以与前台应用程序进行通信以确定它是否存在。 Check if application is running from a background task
如何停止后台任务
确保从后台任务实例的延迟释放,然后就从你的主要方法返回(无论是运行:这可以使用的方法之一,建议在这里完成()用于out-of-proc或BackgroundActivated()用于in-proc)。如果在这个过程中没有别的东西在运行,那么它将退出。
[This](https://stackoverflow.com/questions/38555407/check-if-application-is-running-from-a-background-task/38560015#38560015)可能会有所帮助。 –