UWP仅限后台应用和异步

时间:2017-10-24 09:00:32

标签: c# background uwp iot

我对UWP应用生命周期和代码结构有疑问。它涉及仅限背景的服务,我无法在任何地方找到答案,尽管这可能是因为作为这个领域的n00b,我不知道我想问的问题是什么!

我正在摆弄我的RPi(raspbian / C ++)项目,阅读一些传感器并根据值进行操作,这将全天候运行。虽然我在C ++上很慢,所以我想我会使用UWP / IoT回到C#/ .net的相对安全性。这个应用程序将是无头的,因为它将有一个单独的基于USB的触摸/显示单元(从4d)。

所以我希望它只是后台,作为守护进程/服务24/7运行。这是UWP可能/推荐的模型吗?我已经看过他们说过的几个博客。

假设没关系,我需要读取SPI,因此使用异步方法,但是我想我还需要让我的Run入口点异步吗?在这种情况下,当然要避免混合同步和异步代码,逻辑结论是所有代码/ EVERY方法都需要异步?是吗?

在这个异步/ UWP情况下,典型主循环的等价物是什么:

while(true)
{
    //do something
}

困惑如何将我的有限知识转移到异步UWP世界......

1 个答案:

答案 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
}