Windows IOT 应用服务和后台任务

Windows IOT App Services and Background Tasks

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

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

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

此致, 卡洛斯

有两种方法。

一个正在利用 SerialDevice.FromIdAsync() API 的功能。因为当串口设备正在被一个进程使用时,其他进程会得到调用SerialDevice.FromIdAsync()的空return值,并且在第一个进程处理它之前无法使用它。你可以这样做:

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;
}

另一个正在使用应用服务。您的无头应用程序可以托管一个应用程序服务,而您的有头应用程序可以调用该服务。您可以将串行设备操作放在 App 服务中,每当您的无头或有头应用程序想要使用串行设备时,都必须在 App 服务中挂起信号量。这样就可以达到保护串口设备的目的。你可以这样做:

在您的应用服务中创建信号量:

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

并向您的无头应用提供这两个 API:

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

public void releaseSemphore()
{
    semaphore.Release();
}

在您的无头应用程序中,您需要以下代码行:

Inventory inventory = new Inventory();

        private void SerialCommunication()
        {
            inventory.pendSemphore();

            // Put your serial device operation here
            // ...

            inventory.releaseSemphore();
        }

在您的 headed 应用程序中,您可以通过调用应用程序服务来使用串口设备。更多信息可以参考"how to create and consume an app service".