C# UWP仅后台应用程序和异步

C# UWP仅后台应用程序和异步,c#,background,uwp,iot,C#,Background,Uwp,Iot,我有一个关于UWP应用程序生命周期和代码结构的问题。它只涉及后台服务,我在任何地方都找不到答案,尽管这可能是因为作为这个领域的n00b,我不知道我想问什么问题 我在我的RPi(raspbian/C++)上摆弄着一个项目,读取一些传感器并根据这些值做一些事情,这将是全天候运行的。不过我对C++的速度很慢,所以我想我会使用UWP/IOT回到C/.NET的相对安全性。这个应用程序将是无头的,因为它将有一个单独的基于USB的触摸/显示单元(来自4d) 所以我希望它只在后台运行,作为一个守护进程/服务24

我有一个关于UWP应用程序生命周期和代码结构的问题。它只涉及后台服务,我在任何地方都找不到答案,尽管这可能是因为作为这个领域的n00b,我不知道我想问什么问题

我在我的RPi(raspbian/C++)上摆弄着一个项目,读取一些传感器并根据这些值做一些事情,这将是全天候运行的。不过我对C++的速度很慢,所以我想我会使用UWP/IOT回到C/.NET的相对安全性。这个应用程序将是无头的,因为它将有一个单独的基于USB的触摸/显示单元(来自4d)

所以我希望它只在后台运行,作为一个守护进程/服务24/7运行。这是UWP上可能/推荐的模型吗?我在一些博客上看到过相反的说法

假设没问题,我需要读取SPI,以便使用异步方法,但我想我也需要使我的运行入口点异步?在这种情况下,为了避免混合使用同步和异步代码,逻辑结论是所有代码/每个方法都需要异步?是这样吗

在这种异步/UWP情况下,什么是典型主回路的等效物:

while(true)
{
    //do something
}

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

您试图做的事情只能在Windows IoT(raspberry)上实现。 您可以创建一个将永远运行的无头应用程序

您可以在这里找到一个很好的起点:

这里还有一个简单的示例:

您首先需要安装项目模板,该模板可从以下位置获得:

一旦完成,您将不得不实现一个UWP后台任务,在那里您将检索并永远不会完成它。默认情况下,后台任务在其
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()
        }
    }
}
如果您想结束任务,那么只需调用
deleral.Complete()

也可以注册后台任务取消事件,以便操作系统在您的任务取消时通知您,并优雅地关闭您正在使用的资源

public async void Run(IBackgroundTaskInstance taskInstance)
{
    taskInstance.Canceled += OnCanceled;
}

private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
    // Cleanup
}