未触发BackgroundTask的Metro应用程序问题

时间:2013-05-16 14:28:39

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

没有详细说明,这是基本情景。

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

下载文件后,用户界面中会更新ListView及其基本属性。如果用户从ListViewItem中选择ListView,则会在其旁边显示StorageFile个内容。然后,用户会根据所选的StorageFile内容采取一些操作。

现在提出设计问题:

SuspendingShutdown - 我希望该应用继续从服务器下载文件,因此我注册 2 BackgroundTasks。一个是SystemTrigger,它立即开始,另一个是TimeTrigger,每 15 分钟开始。 BackgroundTasks也会引发通知,以便用户知道有更多文件可用。

Register事件被提出时(Suspending),我Shutdown这些任务。当Unregister事件被引发或者从头开始构建应用程序时,我Resuming这些任务。这可确保 UI BackgroundTask负责处理,而不是两者。

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

这个设计是否存在根本缺陷,或者我错过了一些非常简单的东西?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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);

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