取消注册已关闭应用程序的BackgroundTask

时间:2018-06-05 08:33:30

标签: c# uwp background-task

因为我需要将我的应用程序中的一些值传递给我的BackgroundTask,所以我使用一个不同的设置进行注册。我没有设置EntryPoint,而是将其留空,这使我能够传递值。 通常,我将BackgroundTask添加到我的appxmanifest中,然而,如果没有EntryPoint,BackgroundTask的开始触发 App.xaml.cs 中的 OnBackgroundActivated(BackgroundActivatedEventArgs args)我在后面调用BackgroundTask的自定义静态Start(args.TaskInstance,value1,value2)开始()获取最近的TaskInstance以及自定义值,并调用自定义 Run(),它也会使用自定义值。 BackgroundTask按预期运行,最后调用我的BackgroundTask的常见 Run()方法,该方法调用 GetDeferral.Complete()来更新我的UI,这就是它的外观在代码中。

我的BackgroundTask注册

public async static Task RegisterMainBackgroundTask()
{
    BackgroundAccessStatus backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
    BackgroundTaskBuilder mainTaskBuilder = new BackgroundTaskBuilder
    { Name = "MainTask" };
    mainTaskBuilder.SetTrigger(new TimeTrigger(15, false));
    MainBackgroundTask = mainTaskBuilder.Register();

    if(backgrundAccessStatus == BackgroundAccessStatus.AllowedToSystemPolicy)
        RequestLocationAccess();
    else
        NoAccessNotification();
}

public static void StartupRegisterTasks()
{
    if (MainBackgroundTask != null)
    {
        MainBackgroundTask.Completed -= new BackgroundTaskCompletedEventHandler(BackgroundTaskOnCompleted);
        MainBackgroundTask.Completed += new BackgroundTaskCompletedEventHandler(BackgroundTaskOnCompleted);
    }
}

public static void UnregisterOldBackgroundTasks()=>
    BackgroundTaskRegistration.AllTasks.Where(x => x.Value.Name == "MainTask").ToList().ForEach(x=>x.Value.Unregister(true));

在App.xaml.cs中:

protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
    BackgroundTask.LocalBackgroundWorker.UnregisterOldBackgroundTasks();
    Task.Run(async()=>await BackgroundTask.LocalBackgroundWorker.RegisterMainBackgroundTask()).Wait();
    BackgroundTask.LocalBackgroundWorker.StartupRegisterTasks();
}

protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args) =>
    MainBackgroundTask.Start(args.TaskInstance, value1, value2);

在BackgroundTask.cs

public static void Start(IBackgroundTaskInstance taskInstance, Guid client, Guid company) =>
    new MainBackgroundTask().Run(taskInstance, value1, value2);

public void Run(IBackgroundTaskInstance taskInstance, Guid value1, Guid value2)
{
    Task.Run(async () => await RunBackgroundProcess(taskInstance, value1, value2)).Wait();
    Run(taskInstance);
}

private static TransferService.DataTransfer transfer => 
    new TransferService.DataTransfer();
private async Task RunMainBackgroundProcess(IBackgroundTaskInstance taskInstance, Guid value1, Guid value2)
{
    await transfer.SendJob(value1, value2);
    await transfer.UpdateGeoLocation(taskInstance, value1, value2);
}

public void Run(IBackgroundTaskInstance taskInstance) =>
    taskInstance.GetDeferral().Complete();

我的ApplicationStructure如下:

  • ProjectSolution
    • BackgroundTask(包含BackgroundTask.cs)
    • MyApplication(包含App.xaml.cs和BackgroundTaskRegistration)
    • TransferService(包含Transfer.cs)

只要我的应用程序正在运行或至少最小化,我的BackgroundTask就会按预期运行,但只要应用程序关闭,BackgorundTask就会遇到错误。遗憾的是,我得到的唯一信息来自 unhandlederror.log 并且声称 2018-06-05T09:53:01 ErrorMessage System.NullReferenceException:对象引用未设置为对象的实例。

由于我无法调试已关闭的应用程序,因此我无法确定错误发生的位置。我想,在应用程序关闭时调用TransferService是不可能的,所以我正在搜索一个EntryPoint,我可以在应用程序关闭时第一次调用BackgroundTask时取消注册。 UWP在应用级别上暂停和关闭之间没有区别,所以很遗憾我在关闭应用时无法取消注册。 感谢您解决此问题的任何帮助。

0 个答案:

没有答案
相关问题