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

时间:2016-10-11 10:42:54

标签: c# windows windows-10-iot-core

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

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

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

此致 卡洛斯

1 个答案:

答案 0 :(得分:1)

有两种方法。

一个是利用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;
}

另一个是使用App Service。您的无头应用程序可以托管应用程序服务,您的应用程序可以调用此服务。您可以将您的串行设备操作放在App服务中,并且只要您想要使用串行设备的无头或头部应用程序必须在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();
        }

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

了解更多信息