不讨论太多细节,下面是基本场景。
我有一个Metro应用程序,从服务器下载文件。
一旦文件被下载,ListView
将在UI中更新其基本属性。如果用户从ListView
中选择ListViewItem
,则在其旁边显示StorageFile
内容。然后,用户根据所选的StorageFile
内容采取一些操作。
现在是设计问题:
在Suspending
或Shutdown
上-我希望应用程序继续从服务器下载文件,所以我注册2 BackgroundTasks
。一个是立即启动的SystemTrigger
,另一个是每15分钟启动一次的TimeTrigger
。BackgroundTasks
还会发出通知,以便用户知道有更多的文件可用。
Suspending
事件被触发时,I Register
这些任务(在Shutdown
上)。当Resuming
事件被触发或应用程序从头构建时,我将Unregister
这些任务。这确保了只有UI或BackgroundTask
负责处理,而不是两者都负责。
在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);
如果这对你有帮助,或者你需要更多的提示,请告诉我。