UWP后台任务技术咨询:能否无限运行?如何检测是否已启动?
UWP后台任务相关问题解答
问题1:若未被特定检查条件终止,该后台任务是否会无限运行?
不会。UWP后台任务有严格的运行时长限制:
- 对于
ApplicationTrigger触发的后台任务,默认最大运行时长为10分钟(不同Windows版本可能略有调整),即便代码里写了无限循环,系统到时间后也会强制终止该任务。 - 此外,如果后台任务占用过多CPU、内存等系统资源,系统也会提前终止任务,绝不可能允许其无限运行。
- 补充:你代码里在
Run方法中启动无限循环,会阻塞任务执行逻辑,但这不会改变系统的强制终止规则,到点仍然会被系统终结。
问题2:如何检测后台任务是否运行?能否序列化存储全局句柄来避免重复启动?
检测后台任务运行状态的可靠方法
有两种实用方案:
- 遍历已注册的后台任务
通过BackgroundTaskRegistration.AllTasks获取所有已注册任务,遍历检查任务名称与运行状态:
bool IsTaskRunning(string targetTaskName) { foreach (var task in BackgroundTaskRegistration.AllTasks.Values) { if (task.Name == targetTaskName && task.Status == BackgroundTaskStatus.Running) { return true; } } return false; }
- 用本地存储标记运行状态
在后台任务启动时,向ApplicationData.Current.LocalSettings写入运行标记;同时注册任务的Canceled事件,在任务被主动结束或系统强制终止时清除标记:
// 后台任务Run方法内 public void Run(IBackgroundTaskInstance taskInstance) { // 写入运行标记 ApplicationData.Current.LocalSettings.Values["MyBackgroundTaskIsRunning"] = true; // 注册取消事件,处理任务终止后的标记清除 taskInstance.Canceled += OnTaskCanceled; // 原有业务逻辑... } private void OnTaskCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) { // 清除运行标记 ApplicationData.Current.LocalSettings.Values["MyBackgroundTaskIsRunning"] = false; }
前台应用读取该标记即可判断任务是否处于运行状态。
关于序列化存储全局句柄的可行性
完全不可行。UWP后台任务的句柄(如IBackgroundTaskInstance对象)是进程内的临时对象,无法跨进程传递,也不能序列化存储到数据库或本地文件中。即便你存储了句柄的某种标识,应用重启后该标识也会失效,根本无法复用。因此这种方法不能用来避免重复启动任务,推荐使用上面两种方式检测状态,进而实现避免重复启动的需求。
内容的提问来源于stack exchange,提问作者Bernd Morgeneyer
相关产品推荐
相关产品推荐

