0

无需过多介绍,这里是基本场景。

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

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

现在对于设计问题:

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

我在事件引发(和 on )Register时执行这些任务。当事件引发或从头开始构建应用程序时,我将执行这些任务。这确保了UI或者负责处理,而不是两者都负责。SuspendingShutdownUnregisterResumingBackgroundTask

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

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

4

1 回答 1

1

这种设计存在一个根本缺陷:

我在引发 Suspending 事件时(以及在 Shutdown 时)注册这些任务。当引发 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);

让我知道,如果这有帮助或者您需要更多提示。

于 2013-05-18T09:24:33.780 回答