后台任务的多个实例

本文关键字:实例 后台任务 | 更新日期: 2023-09-27 18:35:08

如何在 UWP 应用中启动同一后台任务的多个实例?

我像本教程中一样注册它:https://msdn.microsoft.com/en-us/library/windows/apps/mt299100.aspx?f=255&MSPPError=-2147217396

第一次这样做时它可以工作,但是当我用不同的名称注册第二个任务时,我得到一个异常:

系统异常:没有足够的配额可用于处理此命令。(HRESULT的例外:0x80070718)

后台任务的多个实例

您收到的错误是与系统上的虚拟内存相关的一般错误。

按照您提到的教程将仅注册每个任务一次,除非您更改以下步骤(注册过程的第一步):

var taskRegistered = false;
var exampleTaskName = "ExampleBackgroundTask";
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
    if (task.Value.Name == exampleTaskName)
    {
        taskRegistered = true;
        break;
    }
}

BackgroundTaskRegistration.AllTasks 的全部意义在于枚举所有应用程序的已注册后台任务。

这意味着一个任务可以注册一次、两次或您想要/需要的次数(尽管我想不出您现在想要这样的事情的任何情况)。

因此,为了注册多个实例,您需要做的就是为要注册的每个实例调用如下方法:

private BackgroundTaskRegistration RegisterTask(
            Type taskType,
            SystemTriggerType systemTriggerType,
            SystemConditionType systemConditionType = SystemConditionType.Invalid)
{
    var builder = new BackgroundTaskBuilder();
    /// A string identifier for the background task.
    builder.Name = taskType.Name;
    /// The entry point of the task.
    /// This HAS to be the full name of the background task: {Namespace}.{Class name}
    builder.TaskEntryPoint = taskType.FullName;
    /// The specific trigger event that will fire the task on our application.
    builder.SetTrigger(new SystemTrigger(systemTriggerType, false));
    /// A condition for the task to run.
    /// If specified, after the event trigger is fired, the OS will wait for
    /// the condition situation to happen before executing the task.
    if (systemConditionType != SystemConditionType.Invalid)
    {
        builder.AddCondition(new SystemCondition(systemConditionType));
    }
    /// Register the task and returns the registration output.
    return builder.Register();
}

请记住,在调用 BackgroundExecutionManager.RequestAccessAsync() 方法时,系统或用户可能会拒绝应用程序访问后台任务系统。

可能阻止您的另一个问题是,如果系统资源不足,它可能不会注册或执行后台任务,以便为更重要的任务节省资源。