Фоновая задача UWP - триггер приложения - не удается создать файл, если этот файл уже существует - PullRequest
0 голосов
/ 02 мая 2018

В UWP я пытаюсь создать простую фоновую задачу по требованию. Поэтому, когда я нажимаю кнопку, я хочу, чтобы фоновая задача запускалась и обрабатывала некоторые файлы в фоновом режиме.

Ниже приведен код моей основной задачи:

public class BackgroundSyncService
{
    private ApplicationTrigger trigger = new ApplicationTrigger();

    public async Task Start()
    {
        if (IsRegistered())
            Deregister();

        BackgroundExecutionManager.RemoveAccess();

        // does this prompt everytime?
        await BackgroundExecutionManager.RequestAccessAsync();

        var builder = new BackgroundTaskBuilder();

        builder.Name = "BackgroundTask";
        builder.TaskEntryPoint = typeof(BackgroundTask).FullName;

        builder.SetTrigger(trigger);
        BackgroundTaskRegistration task = builder.Register();

        task.Completed += Task_Completed;

        var result = await trigger.RequestAsync();
    }

    private void Task_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
    {
        // alert UI
    }

    public void Stop()
    {
        Deregister();
    }

    private void Deregister()
    {
        var taskName = "BackgroundTask";

        foreach (var task in BackgroundTaskRegistration.AllTasks)
            if (task.Value.Name == taskName)
                task.Value.Unregister(true);
    }

    private bool IsRegistered()
    {
        var taskName = "BackgroundTask";

        foreach (var task in BackgroundTaskRegistration.AllTasks)
            if (task.Value.Name == taskName)
                return true;

        return false;
    }
}

Когда код набирает builder.Register(), выдается следующее исключение:

System.Exception: 'Невозможно создать файл, если этот файл уже существует. (Исключение из HRESULT: 0x800700B7) '

Не знаете, что я делаю здесь неправильно или что означает эта ошибка в контексте фоновой задачи?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я использую ApplicationTrigger для регистрации BackgroundTask и создаю новый экземпляр ApplicationTrigger перед повторной регистрацией, исправил эту ошибку для меня.

0 голосов
/ 03 мая 2018

Ваша проблема в том, что у вас есть файл с указанным именем, который уже существует в текущей папке при его создании. Вы можете попытаться указать NameCollisionOption при создании файла.

var file = await ApplicationData.Current.LocalFolder.
    CreateFileAsync("MyFile", CreationCollisionOption.ReplaceExisting);

В качестве кода в вашем примере проекта вы использовали ApplicationData.LocalSettings , когда вы добавляете ключ настройки, вы должны проверить, существует ли ключ.

var settings = Windows.Storage.ApplicationData.Current.LocalSettings;
if (!settings.Values.ContainsKey("BackgroundTask"))
{
    settings.Values.Add("BackgroundTask", "Hello from UWP");
}

Или вы можете использовать ApplicationData.LocalSettings для использования ключа и изменения его значения,

var settings = Windows.Storage.ApplicationData.Current.LocalSettings;
settings.Values["BackgroundTask"] = "Hello from UWP";

Также можно заглянуть в Сохранить и получить настройки и другие данные приложения раздел.

...