【问题标题】:UWP Start background task at startupUWP 在启动时启动后台任务
【发布时间】:2019-01-25 15:13:30
【问题描述】:

我刚开始学习 UWP,我真的很困惑它是如何工作的。我已经看到了几十篇谈论我的问题但不知道如何做我想做的事的帖子。 所以我想制作一个在 Windows 启动时运行的应用程序,我希望该应用程序不可见,因此它需要一个后台任务,如何在不进入应用程序 UI 的情况下触发此后台任务? 该应用程序应该始终运行后台任务,并且它的界面应该用作“设置”,因此我不需要在启动时显示该应用程序。 谢谢。

【问题讨论】:

    标签: c# windows multithreading uwp background


    【解决方案1】:

    如果您刚刚开始使用 Windows Template Studio,它将非常适合您,它是 Visual Studio 的扩展,可让您创建具有许多内置功能的新 uwp 项目,并且您只能选择您想要的功能,这将为您节省大量时间在基本的东西上。 https://github.com/Microsoft/WindowsTemplateStudio

    【讨论】:

    • 谢谢,但我想了解它是如何工作的,而不仅仅是通过向导使用它
    • 向导实际上为您生成了代码以及文档和 cmets,以便您可以真正了解它是如何在您的应用程序中完成的 :)
    • 我取消了这个项目,不喜欢 UWP 应用的工作方式
    【解决方案2】:

    经过大量谷歌搜索后,我找到了这里的路。老实说,我得出了与 Motaz 相同的结论。但在写这篇文章时,我对我已经拥有的东西太投入了。虽然我在这里所拥有的并不是他问题的完美答案。我想回来把我学到的东西发给其他来到这里的人。

    我需要一个应用程序,它在启动时会监控第三方 USB 设备,直到应用程序关闭(无论应用程序是否最小化)

    Windows Template Studio 不错,但文档不多。尤其是在后台任务方面。

    我从这里开始:https://github.com/Microsoft/Windows-universal-samples。但是有两个问题。

    1. 他们合并了所有示例,并且共享了一些代码,这使得在不破坏原始示例的情况下很难将项目拉出来并将其拆分。

    2. 按照他们的后台任务示例,我总是遇到清单问题,并且它需要音频任务

    我回到模板工作室并创建了最简单的带有后台任务的版本。经过大量的试验和错误,我得到了一些有用的东西。我已经在这里发布了:https://github.com/PillarOfSociety/WindowsTemplateStudio-BackgroundTask

    注意事项:

    • 我不是 UWP 方面的专家,在运行此程序时,我无意将其放入商店,也没有尝试。

    • 如果您下载了我的项目并运行它,您应该可以点击“添加事件”和“重新开始”按钮,任务应该会运行并更新进度条。

    • 我使用了 ApplicationTrigger。模板中的原始示例使用了一个 TimeTrigger,它需要 MINUTES 时间(我花了很长时间才弄清楚)。据说应用程序触发器有 30 秒的超时时间。但在我的笔记本电脑上,它们的寿命要长得多。我不知道多久。这个页面很有用:https://docs.microsoft.com/en-us/windows/uwp/launch-resume/support-your-app-with-background-tasks

    • 模板工作室生成的 BackgroundTaskService 将在应用程序关闭后保留已注册的后台任务,但一旦重新运行就不会与它们建立连接,因此在重新运行时,任务似乎无法运行,或者会崩溃触发时的应用。

    • 我发现的重要代码:

      foreach (var task in BackgroundTaskRegistration.AllTasks)
      {
          TestText += task.Value.Name; //gets the typename of the task
          //task.Value.Unregister(true); //will unregister tasks
      }
      await Task.CompletedTask;
      
    • BackgroundTaskRegistration.AllTask​​s 中的任务不是模板工作室使用的 BackgroundTask 类。在我的示例中,我在每次运行时将它们全部注销,以便您将任务作为 BackgroundTask 的实例进行引用。

    希望这对某人有帮助,祝你好运!

    【讨论】: