Windows IOT应用程序服务和后台任务
本文关键字:后台任务 服务 应用程序 IOT Windows | 更新日期: 2023-09-27 18:12:44
目前我有一个Windows IOT无头应用程序,它包含一个由定时器操作的后台任务,它通过串口发送和接收数据。
现在,我需要一个有头的应用程序也能够通过串口发送命令,但由于我不希望多个应用程序同时访问串口,我考虑与无头应用程序创建一个应用程序服务进行通信。
我的问题是:是否有可能在同一个无头应用程序上有后台任务和应用程序服务?如果是这样,是否有可能在App Service被调用时停止后台任务?谢谢。
问候,卡洛斯
有两种方法。
一个是利用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服务来使用串行设备。更多信息可以参考"如何创建和使用应用服务"。