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

标签 c# background uwp iot

我对 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/

相关文章:

uwp - C++/WinRT 控制台 UWP 应用的 AppxManifest.xml 中的入口点是什么?

c# - 无法获取窗口句柄,不支持 Windowless ActiveX 控件?

c# - TimeSpan 的自定义字符串格式

Android 使用 <shape> 设置 View 背景,solid 不起作用

windows - 如何在创建通用 Windows 平台 10 应用程序时在 RelativePanel 中实现 Horizo​​ntalAlignment ="Stretch"?

c# - 文本 block 绑定(bind)不会在运行时更新

c# - 输入的默认样式不知何故搞乱了设计

c# - 用于登录的 Facebook 集成

android - 如何以原始比例设置自定义单选按钮android的背景图像?

CSS后台预加载