没有详细说明,这是基本情景。
我有一个Metro应用程序可以从服务器上下载文件。
下载文件后,用户界面中会更新ListView
及其基本属性。如果用户从ListViewItem
中选择ListView
,则会在其旁边显示StorageFile
个内容。然后,用户会根据所选的StorageFile
内容采取一些操作。
现在提出设计问题:
在Suspending
或Shutdown
- 我希望该应用继续从服务器下载文件,因此我注册 2 BackgroundTasks
。一个是SystemTrigger
,它立即开始,另一个是TimeTrigger
,每 15 分钟开始。 BackgroundTasks
也会引发通知,以便用户知道有更多文件可用。
Register
事件被提出时(Suspending
),我Shutdown
这些任务。当Unregister
事件被引发或者从头开始构建应用程序时,我Resuming
这些任务。这可确保 UI 或BackgroundTask
负责处理,而不是两者。
在Visual Studio中测试时,BackgroundTasks
按预期工作。但是,在Visual Studio之外,BackgroundTasks
似乎永远不会触发。这些BackgroundTasks
请求锁定屏幕访问权限,通过BackgroundExecutionManager.RequestAccessAsync().
这个设计是否存在根本缺陷,或者我错过了一些非常简单的东西?任何帮助将不胜感激。
答案 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);
请告诉我,如果这有帮助,或者您需要更多提示。