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

问题描述 投票:2回答:2

在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)'

不确定我在这里做错了什么或者这个错误在后台任务的上下文中意味着什么?

uwp background-process background-task
2个回答
0
投票

我正在使用ApplicationTrigger进行BackgroundTask注册,并在重新注册之前创建ApplicationTrigger的新实例,为我修复了这个错误。


-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主题。

© www.soinside.com 2019 - 2024. All rights reserved.