我对 UWP 应用生命周期和代码结构有疑问。它与仅后台服务相关,我在任何地方都找不到答案,尽管这可能是因为作为该领域的新手,我不知道我想问什么问题!
我正在我的 RPi (raspbian/C++) 上摆弄一个项目,读取一些传感器并根据这些值做一些事情,这个项目将 24/7 运行。不过,我在 C++ 方面进展缓慢,因此我想我应该使用 UWP/IoT 回到相对安全的 C#/.net。这个应用程序将是 headless 的,因为它将有一个单独的基于 USB 的触摸/显示单元(来自 4d)。
所以我希望它只是后台,作为守护进程/服务 24/7 运行。这是 UWP 上可能/推荐的模型吗?我看过一些博客,他们的说法并非如此。
假设没问题,我需要读取 SPI,以便使用异步方法,但我想我也需要使我的 Run 入口点异步?在这种情况下,为了避免混契约(Contract)步和异步代码,逻辑结论是所有代码/每个方法都需要异步?是这样吗?
在这种异步/UWP 情况下,典型的主循环相当于什么:
while(true)
{
//do something
}
困惑如何将我有限的知识转移到异步 UWP 世界......
最佳答案
您尝试做的事情只能在 Windows IoT(树莓派)上实现。 您可以创建一个将永远运行的 headless 应用程序。
你会在这里找到一个很好的入门者:Building apps for IoT Core
这里还有一个简单的示例:Hello Blinky Background
您首先需要安装此处提供的项目模板:
完成后,您将必须实现一个 UWP 后台任务,您将在其中检索 task deferral并且永远不会完成它。默认情况下,后台任务在其 Run()
方法结束时结束。如果您恢复延期,只有当您完成延期时,延期才会结束。
public sealed class MyLongRunningBackgroundTask : IBackgroundTask
{
BackgroundTaskDeferral deferral;
public async void Run(IBackgroundTaskInstance taskInstance)
{
// We retrieve the deferral to prevent the task to stop
deferral = taskInstance.GetDeferral();
// Run loop calling asynchronous methods
// It can also be a timer or an event callback registration
while(true)
{
await doSomethingAsync()
}
}
}
如果您想结束任务,只需调用 deferral.Complete()
最好注册后台任务取消事件,以便操作系统在您的任务被取消时收到通知,并正常关闭您正在使用的资源。
public async void Run(IBackgroundTaskInstance taskInstance)
{
taskInstance.Canceled += OnCanceled;
}
private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
// Cleanup
}
关于c# - UWP 仅后台应用程序和异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46906237/