Не могу зарегистрировать фоновое задание - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующая фоновая задача:

namespace Background
{
    public sealed class BackgroundTask : IBackgroundTask
    {
        private BackgroundTaskDeferral _deferral;

        public void Run(IBackgroundTaskInstance taskInstance)
        {
            //_deferral = taskInstance.GetDeferral();

        }

в файле с именем Task.cs (не то, что имя файла имеет значение).

Пространство имен фона находится в моем решении, которое содержитпроект Упаковка, который содержит решение UWP, которое должно запустить Backgroundtask:

private async void LaunchBackground()
{
    await BackgroundExecutionManager.RequestAccessAsync();

    var exampleTaskName = "Background";

    foreach (var taskA in BackgroundTaskRegistration.AllTasks)
    {
        if (taskA.Value.Name == exampleTaskName)
        {
            await new ApplicationTrigger().RequestAsync();
            break;
        }
    }

    var builder = new BackgroundTaskBuilder();

    builder.Name = exampleTaskName;
    builder.TaskEntryPoint = "Background.BackgroundTask";

    BackgroundTaskRegistration task = builder.Register();

    await new ApplicationTrigger().RequestAsync();
}

В проекте UWP и Упаковке есть следующее объявление в манифесте:

  <Extensions>
    <Extension Category="windows.backgroundTasks" EntryPoint="Background.BackgroundTask">
      <BackgroundTasks>
        <Task Type="systemEvent" />
      </BackgroundTasks>
    </Extension>
  </Extensions>

Я мог быЯ не добавил ссылку на фоновый проект в мой пакетный проект, но сделал это в моем проекте UWP.

Тем не менее, когда я пытаюсь запустить его, я получаю следующее:

At: BackgroundTaskRegistration task = builder.Register(); System.ArgumentException: 'Value does not fall within the expected range.'

строитель в соответствии с отладкой: - builder {Windows.ApplicationModel.Background.BackgroundTaskBuilder} Windows.ApplicationModel.Background.BackgroundTaskBuilder

Я что-то пропустил или почему это не работает?

Редактировать: после добавлениятриггер:

builder.SetTrigger(new SystemTrigger(SystemTriggerType.BackgroundWorkCostChange, false));

Который я на самом деле не хочу, я получаю новую ошибку:

При: await new ApplicationTrigger().RequestAsync(); System.Runtime.InteropServices.COMException: 'Error HRESULT E_FAIL has been returned from a call to a COM component.'

1 Ответ

0 голосов
/ 29 ноября 2018

Попробуйте следующий код, мы должны проверить наличие разрешений на доступ к фоновой задаче, затем зарегистрировать фоновую задачу:

var hasAccess = await BackgroundExecutionManager.RequestAccessAsync();
if (hasAccess == BackgroundAccessStatus.DeniedBySystemPolicy 
    || hasAccess == BackgroundAccessStatus.DeniedByUser
    || hasAccess == BackgroundAccessStatus.Unspecified)
{
    await new MessageDialog("ACCESS DENIED").ShowAsync();
    return;
}

/////////////////////begin registering bg task
var task = new BackgroundTaskBuilder
{
    Name = "Background",
    TaskEntryPoint = typeof(Background.BackgroundTask).ToString()
};

//Trigger is necessary for registering bg tasks but Conditions are  optional
//set a trigger for your bg task to run 
//for ex. below Trigger will run when toast Notifications (cleared, user pressed an action button and so on)
ToastNotificationActionTrigger actiontrigger = new ToastNotificationActionTrigger();

task.SetTrigger(actiontrigger);

//Optional Conditions like Internet Connection
//var condition = new SystemCondition(SystemConditionType.InternetAvailable);

//task.AddCondition(condition);//set condition

BackgroundTaskRegistration registration = task.Register();//Register the task

Также мы должны проверить, запущена ли фоновая задача, прежде чем зарегистрировать ее.Пример кода ниже:

var isAlreadyRegistered = BackgroundTaskRegistration.AllTasks.Any(t => t.Value?.Name == "BackroundTask");
if (isAlreadyRegistered)
{
    foreach (var tsk in BackgroundTaskRegistration.AllTasks)
    {
        if (tsk.Value.Name == "BackroundTask")
        {
            tsk.Value.Unregister(true);
            break;
        }
    }
}

Дополнительная информация Создание и регистрация фоновой задачи вне процесса

...