UWP后台任务 - 应用程序触发器 - 当该文件已存在时无法创建文件

时间:2018-05-02 02:37:28

标签: uwp background-process background-task

在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 :(得分:0)

我正在使用ApplicationTrigger进行BackgroundTask注册,并在重新注册之前创建ApplicationTrigger的新实例。

答案 1 :(得分:-1)

对于您的问题,这是因为您在创建文件时,当前文件夹中已存在具有指定名称的文件。您可以在创建文件时尝试指定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";

您还可以查看Store and retrieve settings and other app data主题。