【问题标题】:Metro Application Issue with BackgroundTask NOT triggered未触发 BackgroundTask 的 Metro 应用程序问题
【发布时间】:2013-05-16 14:28:39
【问题描述】:

不做太多细节,这里是基本场景。

我有一个从服务器下载文件的 Metro 应用程序。

下载文件后,ListView 会在 UI 中使用其基本属性进行更新。如果用户从ListView 中选择一个ListViewItem,它的StorageFile 内容会显示在它旁边。然后,用户根据所选的StorageFile 内容采取一些行动。

现在是设计问题:

SuspendingShutdown - 我希望应用程序继续从服务器下载文件,所以我注册了2 BackgroundTasks。一个是SystemTrigger,它立即启动,另一个是TimeTrigger,每15分钟启动一次。 BackgroundTasks 还会发出通知,以便用户知道还有更多文件可用。

Suspending 事件引发时(以及在Shutdown 上),我Register 这些任务。当引发Resuming 事件或从头开始构建应用程序时,我Unregister 这些任务。这可确保 UIBackgroundTask 负责处理,而不是两者都负责。

在 Visual Studio 中对此进行测试时,BackgroundTasks 按预期工作。但是,在 Visual Studio 之外,BackgroundTasks 似乎永远不会触发。这些BackgroundTasks 请求锁定屏幕访问,通过BackgroundExecutionManager.RequestAccessAsync().

此设计是否存在根本缺陷,还是我遗漏了一些非常简单的东西?任何帮助将不胜感激。

【问题讨论】:

  • 在您的测试中,您是否在 Surface RT 上进行测试?您的开发环境和消费环境之间存在很大差异的一件事是处理能力,以及诸如数据使用限制之类的事情。你可能会遇到其中任何一个。
  • 我目前正在我的电脑上进行测试。
  • 您是否在不在开发环境中时手动将应用程序发布到您的锁定屏幕?来自 API:“用户必须先将您的应用置于锁定屏幕,然后应用才能使用这些后台任务。应用可以通过调用 RequestAccessAsync 请求锁定屏幕访问。这会显示一个对话框,要求用户“允许”或“不要”在锁定屏幕上“不允许”您的应用。一个应用只允许请求一次锁定屏幕访问;随后对 RequestAccessAsync 的任何调用都将被忽略。”
  • 我很抱歉继续“通过议案”,只是试图确保所有的基础都被覆盖。您是否确保后台任务声明中的入口点指向后台任务的正确命名空间和类?我知道即使应用清单存在问题(例如徽标图像大小不正确),我的开发环境中也有很多东西可以工作。

标签: c#-4.0 windows-runtime microsoft-metro background-process winrt-async


【解决方案1】:

这个设计有一个根本性的缺陷:

我在引发 Suspending 事件时注册这些任务(以及 关闭)。当引发 Resuming 事件时,我取消注册这些任务。

不是应该如何使用 BackgroudnTasks。您应该只注册一次任务并保持注册状态,一旦任务启动,检查应用程序是否正在运行(使用 ApplicationSettings 中的共享属性)。如果是,就结束任务,如果不是,继续下载。另请注意,后台任务只会运行大约每 15 分钟两秒。您不能只在这些任务中下载大数据,只检查新文件、启动 BackgroundDownloader 和/或显示 Toast 通知。

在 Visual Studio 中对此进行测试时,BackgroundTasks 作为 预期的。但是,在 Visual Studio 之外,BackgroundTasks 永远不会 似乎触发。这些 BackgroundTasks 请求锁定屏幕访问,通过 BackgroundExecutionManager.RequestAccessAsync()。

首先,这些任务是否在单独的库/项目中,即 Windows 运行时组件?如果没有,那么它将无法正常工作。其次,如果您的任务需要锁屏访问,用户必须在 RequestAccessAsync 调用后显示的对话框中允许执行此操作 - 如果您在 Suspending 事件中注册任务,这将不起作用。

无论如何,正如我所提到的,要下载大文件,您应该使用这些类:

StorageFile file = await folder.CreateFileAsync(path, CreationCollisionOption.ReplaceExisting);
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(new Uri(filePath), file);

如果这有帮助或者您需要更多提示,请告诉我。

【讨论】:

    猜你喜欢
    • 2016-11-26
    • 2012-01-12
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多