Windows IOT应用程序服务和后台任务

本文关键字:后台任务 服务 应用程序 IOT Windows | 更新日期: 2023-09-27 18:12:44

目前我有一个Windows IOT无头应用程序,它包含一个由定时器操作的后台任务,它通过串口发送和接收数据。

现在,我需要一个有头的应用程序也能够通过串口发送命令,但由于我不希望多个应用程序同时访问串口,我考虑与无头应用程序创建一个应用程序服务进行通信。

我的问题是:是否有可能在同一个无头应用程序上有后台任务和应用程序服务?如果是这样,是否有可能在App Service被调用时停止后台任务?谢谢。

问候,卡洛斯

Windows IOT应用程序服务和后台任务

有两种方法。

一个是利用SerialDevice.FromIdAsync() API的特性。因为当串行设备正在使用一个进程时,其他进程将获得调用SerialDevice.FromIdAsync()的null返回值,并且在第一个进程处理它之前不能使用它。你可以这样做:

SerialDevice serialPort = null;
private async void SerialDeviceOperation()
{
    var selector = SerialDevice.GetDeviceSelector();
    var device = await DeviceInformation.FindAllAsync(selector);
    try
    {
        while (serialPort == null)
        {
            serialPort = await SerialDevice.FromIdAsync(device[0].Id);
        }
        // Your code in here
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
    // Do something...
    // Write or read data via serial device
    // ...
    // After complete the operation, dispose the device
    serialPort.Dispose();
    serialPort = null;
}

另一个是使用应用程序服务。你的headless应用可以托管一个app服务,而你的headless应用可以调用这个服务。你可以把你的串行设备操作放在App服务中,当你的headless或heading应用程序想要使用串行设备时,必须在App服务中挂起信号量。从而达到保护串行设备的目的。你可以这样做:

在你的App服务中创建信号量:

private static Semaphore semaphore = new Semaphore(1,1);

为你的无头应用提供这两个api:

public bool pendSemphore()
{
    return semaphore.WaitOne();
}
public void releaseSemphore()
{
    semaphore.Release();
}

在你的headless应用中,你需要以下代码行:

Inventory inventory = new Inventory();
        private void SerialCommunication()
        {
            inventory.pendSemphore();
            // Put your serial device operation here
            // ...
            inventory.releaseSemphore();
        }

在你的头部应用中,你可以通过调用app服务来使用串行设备。更多信息可以参考"如何创建和使用应用服务"。