目前我有一个Windows IOT无头应用,它包含一个由定时器操作的后台任务,它通过串口发送和接收数据。
现在,我需要一个头脑的应用程序也可以通过串口发送命令,但由于我不希望多个应用程序同时访问串口,我想到与无头应用程序通信创建一个应用服务。
我的问题是:是否可以在同一个无头应用程序上安装后台任务和应用程序服务?如果是这样,是否可以在调用App Service时停止后台任务?感谢。
此致 卡洛斯
答案 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".
了解更多信息