#c# #windows #windows-10-iot-core
#c# #Windows #windows-10-iot-core
Вопрос:
на данный момент у меня есть приложение Windows IOT без головы, которое состоит из фоновой задачи, управляемой таймером, который отправляет и получает данные через последовательный порт.
Теперь мне нужно приложение с головкой, чтобы иметь возможность отправлять команды через последовательный порт, но поскольку я не хочу, чтобы несколько приложений одновременно обращались к последовательному порту, я подумал об общении с приложением без головы, создающим службу приложений.
Мой вопрос: возможно ли иметь фоновую задачу и службу приложений в одном и том же приложении без головы? Если да, можно ли остановить фоновую задачу во время вызова службы приложений? Спасибо.
С уважением, Карлос
Комментарии:
1. Не уверен, что вы можете остановить фоновую задачу во время работы службы приложений. Однако, если вы хотите сделать их эксклюзивными, вы можете сделать одну простую вещь — использовать именованные мьютексы или семафоры, которые являются межпроцессными, для синхронизации процессов.
Ответ №1:
Существует два метода.
Одним из них является использование функции SerialDevice.Из API idasync(). Потому что, когда последовательное устройство используется одним процессом, другие процессы получат нулевое возвращаемое значение при вызове SerialDevice.FromIdAsync() и не может использовать его, пока первый процесс не удалит его. Вы можете сделать это следующим образом:
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;
}
Другой вариант — использование службы приложений. В вашем безголовом приложении может размещаться служба приложений, а ваше приложение с заголовком может вызывать эту службу. Вы можете поместить работу своего последовательного устройства в службу приложений, и всякий раз, когда ваше приложение без головы или с головой, которое хочет использовать последовательное устройство, должно передавать семафор в службу приложений. Таким образом, вы можете достичь цели защиты последовательного устройства. Вы можете сделать это следующим образом:
Создайте семафор в своей службе приложений:
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();
}
В вашем приложении с заголовком вы можете использовать последовательное устройство, вызвав службу приложений. Более подробную информацию вы можете найти в разделе «как создать и использовать службу приложений».
Комментарии:
1. Прежде всего, спасибо за ваш ответ, это действительно помогло мне.
2. Прежде всего, спасибо за ваш ответ, это действительно помогло мне. У меня все еще есть некоторые сомнения относительно того, как использовать семафор. Я использовал их в Arduino, но здесь я немного смущен. Причина в том, что для последовательной связи у меня есть класс с некоторыми методами, которые подключаются к последовательному порту, а затем продолжают прослушивать или отправлять сообщения. Пока я создаю экземпляр этого класса в StartupTask и использую его. Теперь мне нужно создать еще один экземпляр в службе приложений, который вступает в конфликт с первым. Также я не знаю, как использовать один и тот же семафор между двумя задачами. Спасибо