Metro应用程序问题,后台任务未触发



不讨论太多细节,下面是基本场景。

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

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

现在是设计问题:

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

Suspending事件被触发时,

I Register这些任务(在Shutdown上)。当Resuming事件被触发或应用程序从头构建时,我将Unregister这些任务。这确保了只有UIBackgroundTask负责处理,而不是两者都负责。

在Visual Studio中测试时,BackgroundTasks按预期工作。然而,在Visual Studio之外,BackgroundTasks似乎永远不会触发。BackgroundTasks请求锁屏访问,通过BackgroundExecutionManager.RequestAccessAsync().

这个设计有根本缺陷吗?还是我错过了一些非常简单的东西?

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

当suspend事件被触发时注册这些任务关闭)。I在引发恢复事件时注销这些任务。

这是而不是 backgroundtasks应该如何使用。你应该只注册你的任务一次并保持它们注册,一旦任务启动,检查应用程序是否正在运行(使用ApplicationSettings中的共享属性)。如果是,直接结束任务,如果不是,继续下载。还要注意,后台任务每15分钟只运行大约 2秒。你不能在这些任务中下载大数据,只能检查新文件,启动BackgroundDownloader和/或显示Toast通知。

在Visual Studio中测试时,BackgroundTasks的工作方式为预期。然而,在Visual Studio之外,后台任务从来没有似乎触发了。这些后台任务请求锁屏访问BackgroundExecutionManager.RequestAccessAsync () .

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

无论如何,正如我提到的,要下载大文件,你应该使用这些类:
StorageFile file = await folder.CreateFileAsync(path, CreationCollisionOption.ReplaceExisting);
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(new Uri(filePath), file);

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

最新更新