2016-10-11 4 views
0

pour le moment J'ai une application sans interface Windows IOT qui consiste en une tâche d'arrière-plan opérée par une minuterie, qui envoie et reçoit des données via le port série. Maintenant, j'ai besoin d'une application dirigée pour pouvoir envoyer des commandes via le port série, mais comme je ne veux pas que plusieurs applications accèdent au port série en même temps, j'ai pensé à communiquer avec l'application headless. un service d'application.Windows IOT App Services et tâches d'arrière-plan

Ma question est: Est-il possible d'avoir une tâche de fond et un App Service sur la même application sans tête? Si oui, est-il possible d'arrêter la tâche en arrière-plan pendant que le service App est appelé? Merci.

Cordialement, Carlos

+0

Vous ne savez pas si vous pouvez arrêter la tâche d'arrière-plan pendant que le service d'application est en cours d'exécution. Cependant, si vous voulez les rendre exclusifs, une chose simple que vous pouvez faire est d'utiliser mutex ou sémaphore nommé qui sont inter-processus pour effectuer la synchronisation du processus. – Jackie

Répondre

1

Il existe deux méthodes.

On utilise la fonctionnalité de SerialDevice.FromIdAsync() API. Parce que lorsque le périphérique série est en cours d'utilisation d'un processus, les autres processus obtiendront une valeur de retour null d'appel SerialDevice.FromIdAsync() et ne peuvent pas l'utiliser jusqu'à ce que le premier processus le dispose. Vous pouvez le faire comme ceci:

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; 
} 

Un autre utilise App Service. Votre application sans écran peut héberger un service d'application et votre application dirigée peut appeler ce service. Vous pouvez mettre votre appareil en série dans le service App et chaque fois que votre application sans tête ou dirigée qui veut utiliser le périphérique série doit suspendre le sémaphore dans le service App. Ainsi, vous pouvez atteindre l'objectif de protection du périphérique série. Vous pouvez le faire comme ceci:

Créer le sémaphores dans votre service App:

private static Semaphore semaphore = new Semaphore(1,1); 

et de fournir ces deux API à votre application sans tête:

public bool pendSemphore() 
{ 
    return semaphore.WaitOne(); 
} 

public void releaseSemphore() 
{ 
    semaphore.Release(); 
} 

Dans votre application sans tête, vous avez besoin de la lignes de code suivantes:

Inventory inventory = new Inventory(); 

     private void SerialCommunication() 
     { 
      inventory.pendSemphore(); 

      // Put your serial device operation here 
      // ... 

      inventory.releaseSemphore(); 
     } 

Dans votre application dirigée, vous pouvez utiliser un périphérique série en appelant le service d'application e. Plus d'informations que vous pouvez référencer "how to create and consume an app service".

+0

Tout d'abord, merci pour votre réponse, cela m'a vraiment aidé. – Carlos

+0

Tout d'abord, merci pour votre réponse, cela m'a vraiment aidé. J'ai encore des doutes sur l'utilisation du sémaphore. Je les ai utilisés dans Arduino mais ici je suis un peu confus. La raison en est que pour les communications série, j'ai une classe avec des méthodes qui se connectent au port série, puis continue à écouter ou envoie des messages. Jusqu'à présent, je crée une instance de cette classe dans StartupTask et l'utilise. Maintenant, j'ai besoin de créer une autre instance dans le service d'application, qui entre en conflit avec le premier. Aussi je ne sais pas comment partager le même sémaphore entre les deux tâches. Merci – Carlos