C# 4.0 未触发后台任务的Metro应用程序问题
不需要太多细节,这里是基本场景 我有一个Metro应用程序,可以从服务器下载文件 下载文件后,C# 4.0 未触发后台任务的Metro应用程序问题,c#-4.0,windows-runtime,microsoft-metro,background-process,winrt-async,C# 4.0,Windows Runtime,Microsoft Metro,Background Process,Winrt Async,不需要太多细节,这里是基本场景 我有一个Metro应用程序,可以从服务器下载文件 下载文件后,ListView将在UI中更新其基本属性。如果用户从ListView中选择一个ListViewItem,它的StorageFile内容将显示在旁边。然后,用户根据所选的StorageFile内容采取一些操作 现在开始设计问题: 在挂起或关闭-我希望应用程序继续从服务器下载文件,因此我注册了2背景任务。一个是立即启动的SystemTrigger,另一个是每隔15分钟启动的TimeTrigger。Backg
ListView
将在UI中更新其基本属性。如果用户从ListView
中选择一个ListViewItem
,它的StorageFile
内容将显示在旁边。然后,用户根据所选的StorageFile
内容采取一些操作
现在开始设计问题:
在挂起
或关闭
-我希望应用程序继续从服务器下载文件,因此我注册了2背景任务
。一个是立即启动的SystemTrigger
,另一个是每隔15分钟启动的TimeTrigger
。BackgroundTasks
也会发出通知,以便用户知道更多的文件可用
I在引发挂起
事件时(以及在关闭时
)注册这些任务。I在引发恢复
事件或从头构建应用程序时,取消注册这些任务。这确保了UI或BackgroundTask
负责处理,而不是两者都负责
在Visual Studio中测试时,背景任务
按预期工作。然而,在Visual Studio之外,背景任务
似乎从未触发。这些BackgroundTasks
request锁屏通过BackgroundExecutionManager.RequestAccessAsync()访问。
这个设计有没有根本性的缺陷,或者我遗漏了一些非常简单的东西?任何帮助都将不胜感激。此设计存在一个根本缺陷:
我在引发挂起事件时注册这些任务(并在
关闭)。我在引发恢复事件时注销这些任务
这是而不是应该如何使用BackgroundTasks。您应该只注册一次任务,并保持注册状态,一旦任务启动,检查应用程序是否正在运行(使用ApplicationSettings中的shared属性)。如果是,只需结束任务,如果不是,下载。还要注意,后台任务每15分钟只运行约两秒钟。您不能只下载这些任务中的大数据,只检查新文件,启动BackgroundDownloader和/或显示Toast通知
在VisualStudio中测试时,背景任务的工作方式如下
预期。然而,在VisualStudio之外,背景任务从未
似乎触发了。这些背景任务请求通过
BackgroundExecutionManager.RequestAccessAsync()
首先,这些任务是否在单独的库/项目中,即Windows运行时组件中?如果不行,那就不行了。其次,如果您的任务需要锁屏访问,则用户必须允许在RequestAccessAsync调用后显示的对话框中执行此操作-如果您在挂起事件中注册任务,则此操作将不起作用
无论如何,正如我提到的,要下载大文件,您应该使用以下类:
StorageFile file = await folder.CreateFileAsync(path, CreationCollisionOption.ReplaceExisting);
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(new Uri(filePath), file);
如果这有帮助或者您需要更多提示,请告诉我。在您的测试中,您是否在表面RT上测试?在您的开发环境和消费环境之间有一个很大的不同,那就是处理能力,以及数据使用限制。你可能会遇到这两种情况之一。我目前正在电脑上进行测试。你是否在不在开发环境下手动将应用程序发布到锁屏上?在API中:“用户必须将应用程序置于锁屏上,应用程序才能使用这些后台任务。应用程序可以通过调用RequestAccessAsync请求锁屏访问。这将显示一个对话框,要求用户“允许”或“不允许”“锁定屏幕上的应用程序。一个应用程序只允许请求锁屏访问一次;将忽略对RequestAccessAsync的任何后续调用。“我很抱歉继续‘过场’,只是想确保所有的基础都被覆盖。您是否确保后台任务声明中的入口点指向后台任务的正确名称空间和类?我知道,在我的开发环境中,即使应用程序清单出现问题(例如徽标图像大小不正确),很多事情都能正常工作。