TimeTrigger未在单进程UWP场景中触发

时间:2016-10-07 17:47:51

标签: c# uwp prism background-task prism-6

过去几天我一直在撞击显示器。我正在为Windows应用商店开发一个UWP应用程序(目标是14393),我正在使用Prism / Unity框架进行MVVM / IoC。

由于更新Live Tile所需的数据存储在实现Repository模式的类中,并且所有内容都通过Unity进行管理,因此我没有为后台执行创建单独的进程,因此甚至简化了整个BGTask注册过程

实际的BGTask注册码如下:

#TODO: Use bar to reduce the size of foo

注册成功完成。在PowerShell中执行Get-AppBackgroundTask会显示两个任务。但是,TimeTrigger永远不会触发。使用MaintenanceTrigger交换TimeTrigger可以解决问题,尽管需要将智能手机插入充电器,这是不可接受的解决方法。

强制任务通过VisualStudio或PowerShell运行(Start-AppBackgroundTask -TaskID)正确执行并且磁贴更新。

您还有其他有用的提示可供分享吗?

编辑12/01/2017 我创建了一个包含Visual Studio解决方案的Repro,其中包含两个项目:

  • 实时平铺测试简单:使用UWP每15分钟更新一次直播平铺就这么简单。一切都按预期工作。
  • Live Tile Test Prism:再次,使用Prism和Unity对上述项目进行简单转换。不起作用,因为当操作系统尝试启动应用程序以更新磁贴时,Unity容器为空(不会初始化)。

这解释了我遇到问题的原因:Unity没有初始化,我无法通过存储库检索数据,应用程序崩溃和GG。

现在我只需要了解为什么Unity在OnBackgroundActivated方法中不可用。差不多有人!!

Repro:https://github.com/eraser85/LiveTileTestRepro

2 个答案:

答案 0 :(得分:0)

代码看起来很好,我在这里尝试更改的唯一事情是使用IsNetwokRequested属性和TimeTrigger频率值,你确定常量/变量你使用的是大于还是等于15?

以下是一个示例:

BackgroundTaskBuilder builder = new BackgroundTaskBuilder { Name = "YourBgTaskName" };
builder.SetTrigger(new TimeTrigger(15, false));
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
builder.Register();

答案 1 :(得分:0)

好的,经过一些更多的测试,我终于找到了解决方案。

如前所述,问题源于Prism:基本上,当由OS启动并通过OnBackgroundActivated()进入时,IoC容器未初始化。

解决方案,即使看起来很糟糕,实际上是完全可行和正确的(恕我直言!)。在OnBackgroundActivated()中,只需从头开始初始化所有内容(查看Prism's Source了解实现详细信息):在我的具体情况下,我只是调用了CreateAndConfigureContainer()并重新注册了所有内容我和# 39; ve放入OnInitializeAsync()(例如repos,services ..)。

我与开发者opened an issue。也许解决方案已经开始了,但同时也应该这样做。