我们能否将 UWP BackgroundTask(WindowsRuntimeComponent) 托管为 Windows 服务?
Posted
技术标签:
【中文标题】我们能否将 UWP BackgroundTask(WindowsRuntimeComponent) 托管为 Windows 服务?【英文标题】:Can we able to host UWP BackgroundTask(WindowsRuntimeComponent) as Windows service? 【发布时间】:2016-10-07 06:18:36 【问题描述】:我在 UWP 中使用 WindowsRuntimeComponent 创建了一个后台任务。并使用计时器在 UWP App“OnNavigatedTo”事件中注册 BackgroundTask。 它工作正常。我的问题是,这是注册 BackgroundTask 的唯一方法,还是我们可以像 Windows 服务一样托管它?这样它就可以在机器启动时自动运行,而 UWP 应用程序没有启动。
任何人都可以帮助实现这一目标吗?
问候 苏雷什K
【问题讨论】:
检查这个:msdn.microsoft.com/en-us/windows/uwp/launch-resume/… 和这个:***.com/questions/32229375/… 【参考方案1】:以便在没有 UWP App 启动的情况下机器启动时自动运行。
有两种实现后台任务的方法:进程内和进程外。 Windows 10 版本 1607 中引入了进程内后台支持,以简化编写后台任务。
对于单进程后台任务,它的生命周期受应用生命周期的影响,正如您所关心的,在您重新启动机器后,您需要启动 uwp 应用来运行任务。更多详情请见Create and register a single process background task。 但是对于多进程的后台任务,一旦你注册了带有时间触发器的后台任务,它将一直运行,直到你取消注册它。重新启动机器后,任务将自动启动,无需启动应用程序。更多详情请见Create and register a background task that runs in a separate process。
当您为后台任务TaskEntryPoint
创建windows runtime component
时,我认为您创建的后台任务是单独的进程。所以你可以测试它,看看在没有应用启动的情况下机器重启后后台任务是否可以运行(注意你没有设置任何可能阻止任务的条件)。例如,我编写了一个带有时间触发器的单独进程后台任务,每 15 分钟将当前时间写入文本文件。在我关闭机器并在第二天启动它后,它将继续将数据写入文件而无需启动应用程序。这是我的部分结果:
10/10/2016 5:47:25 PM second activity10/10/2016 6:02:25 PM first activity
10/10/2016 6:02:25 PM second activity10/11/2016 9:04:19 AM first activity
10/11/2016 9:04:19 AM second activity10/11/2016 9:27:44 AM first activity
10/11/2016 9:27:44 AM second activity10/11/2016 9:42:44 AM first activity
更多后台任务详情请参考Guidelines for background tasks和official sample。
这是注册 BackgroundTask 的唯一方法,还是我们可以像 Windows 服务一样托管它?
Windows服务有很多特点,比如没有UI,只要windows运行就运行。对于这些,听起来像应用服务具有相似的特征。应用服务被实现为后台任务。这使前台应用程序能够调用另一个应用程序中的应用服务来执行幕后任务。在您的机器上部署应用服务提供商后,您可以随时从客户端应用调用后台任务,而无需启动服务提供商应用。但是这个后台任务会和你的前台客户端应用程序有相同的生命周期,这意味着如果你不启动客户端应用程序,应用程序服务将无法连接。更多详情请参考Create and consume an app service。
总的来说,单独进程中的后台任务可以满足您的要求。
【讨论】:
以上是关于我们能否将 UWP BackgroundTask(WindowsRuntimeComponent) 托管为 Windows 服务?的主要内容,如果未能解决你的问题,请参考以下文章
UWP使用AppService向另一个UWP客户端应用程序提供服务
UWP使用AppService向另一个UWP客户端应用程序提供服务
从 UWP BackgroundTask 调用 MediaCapture.InitializeAsync