2016-10-11 3 views
0

현재 IOT 헤드리스 앱은 직렬 포트를 통해 데이터를 송수신하는 타이머에 의해 작동되는 백그라운드 작업으로 구성됩니다.Windows IOT App 서비스 및 백그라운드 작업

이제 직렬 포트를 통해 명령을 보낼 수있는 헤드 형 응용 프로그램이 필요하지만 동시에 여러 개의 응용 프로그램이 직렬 포트에 액세스하는 것을 원하지 않으므로 헤드리스 응용 프로그램과 통신하는 것에 대해 생각했습니다. 앱 서비스.

내 질문은 : 동일한 헤드리스 앱에 백그라운드 작업과 앱 서비스를 둘 수 있습니까? 그렇다면 App 서비스가 호출되는 동안 백그라운드 작업을 중지 할 수 있습니까? 감사.

감사합니다, 카를로스

+0

앱 서비스가 실행되는 동안 백그라운드 작업을 중지 할 수 있는지 여부는 확실하지 않습니다. 그러나 이들을 독점적으로 만들고 싶다면, 프로세스 동기화를 수행하기 위해 프로세스 간 명명 된 뮤텍스 또는 세마포어를 사용하면됩니다. – Jackie

답변

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".

+0

우선, 답변 해 주셔서 정말 도움이되었습니다. – Carlos

+0

우선, 답변 해 주셔서 정말 도움이되었습니다. 세마포어를 사용하는 방법에 대해서는 여전히 의문이 있습니다. 나는 그들을 Arduino에서 사용했으나 여기서 약간 혼란 스럽다. 그 이유는 직렬 통신을 위해 직렬 포트에 연결 한 몇 가지 방법으로 클래스를 가지고 있고 계속 듣거나 메시지를 보냅니다. 지금까지 StartupTask에이 클래스의 인스턴스를 만들고 사용했습니다. 이제 App Service에서 다른 인스턴스를 만들어야합니다.이 인스턴스는 첫 번째 인스턴스와 충돌합니다. 또한 두 작업간에 동일한 세마포를 공유하는 방법을 알지 못합니다. 감사 – Carlos

관련 문제