我对UWP应用生命周期和代码结构有疑问。它涉及仅限背景的服务,我无法在任何地方找到答案,尽管这可能是因为作为这个领域的n00b,我不知道我想问的问题是什么!
我正在摆弄我的RPi(raspbian / C ++)项目,阅读一些传感器并根据值进行操作,这将全天候运行。虽然我在C ++上很慢,所以我想我会使用UWP / IoT回到C#/ .net的相对安全性。这个应用程序将是无头的,因为它将有一个单独的基于USB的触摸/显示单元(从4d)。
所以我希望它只是后台,作为守护进程/服务24/7运行。这是UWP可能/推荐的模型吗?我已经看过他们说过的几个博客。
假设没关系,我需要读取SPI,因此使用异步方法,但是我想我还需要让我的Run入口点异步吗?在这种情况下,当然要避免混合同步和异步代码,逻辑结论是所有代码/ EVERY方法都需要异步?是吗?
在这个异步/ UWP情况下,典型主循环的等价物是什么:
while(true)
{
//do something
}
困惑如何将我的有限知识转移到异步UWP世界......
答案 0 :(得分:4)
您只能在Windows IoT(raspberry)上尝试做的事情。 您可以创建一个永不运行的无头应用程序。
你会在这里找到一个好的首发: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
}