因为我需要将我的应用程序中的一些值传递给我的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如下:
只要我的应用程序正在运行或至少最小化,我的BackgroundTask就会按预期运行,但只要应用程序关闭,BackgorundTask就会遇到错误。遗憾的是,我得到的唯一信息来自 unhandlederror.log 并且声称 2018-06-05T09:53:01 ErrorMessage System.NullReferenceException:对象引用未设置为对象的实例。
由于我无法调试已关闭的应用程序,因此我无法确定错误发生的位置。我想,在应用程序关闭时调用TransferService是不可能的,所以我正在搜索一个EntryPoint,我可以在应用程序关闭时第一次调用BackgroundTask时取消注册。 UWP在应用级别上暂停和关闭之间没有区别,所以很遗憾我在关闭应用时无法取消注册。 感谢您解决此问题的任何帮助。