Службы приложений Windows IOT и фоновые задачи

#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 и использую его. Теперь мне нужно создать еще один экземпляр в службе приложений, который вступает в конфликт с первым. Также я не знаю, как использовать один и тот же семафор между двумя задачами. Спасибо