2016-10-11 10 views
0

現時点では、シリアルI/Oポートを介してデータを送受信するタイマーによって操作されるバックグラウンドタスクで構成されるWindows IOTヘッドレスアプリがあります。Windows IOT Appサービスとバックグラウンドタスク

私はシリアルポート経由でコマンドを送信できるようにするために、ヘッドアプリケーションも必要ですが、複数のアプリケーションが同時にシリアルポートにアクセスしないように、私はヘッドレスアプリケーションと通信することを考えましたAppサービス。

私の質問です:同じヘッドレスアプリケーションでバックグラウンドタスクとAppサービスを使用することは可能ですか?もしそうなら、Appサービスが呼ばれている間にバックグラウンドタスクを停止することは可能でしょうか?ありがとう。

よろしく、 カルロス

+0

アプリサービスの実行中にバックグラウンドタスクを停止できるかどうかはわかりません。しかし、排他的にしたい場合は、プロセスの同期を行うためにプロセス間の名前付きミューテックスまたはセマフォを使用することができます。 – Jackie

答えて

1

2つの方法があります。

SerialDevice.FromIdAsync()APIの機能を利用しています。シリアルデバイスが1つのプロセスを使用している場合、他のプロセスは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; 
} 

もう1つはApp Serviceを利用しています。あなたのヘッドレスアプリはAppサービスをホストすることができ、あなたの有力アプリはこのサービスを呼び出すことができます。シリアルデバイスの操作をAppサービスに置くことができます。また、シリアルデバイスを使用するヘッドレスまたはヘッドのアプリケーションがAppサービスでセマフォを保留しなければならないときはいつでも使用できます。したがって、シリアルデバイスを保護するという目標を達成することができます。あなたはこのようにそれを行うことができます。

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

をそして、あなたの頭のないアプリにこれら2つの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(); 
     } 

あなたのヘッド搭載アプリでは、アプリケーションサービスe。参考にできる情報"how to create and consume an app service".

+0

まず、あなたの答えをありがとう、本当に助けてくれました。 – Carlos

+0

まず、あなたの答えをありがとう、本当に助けてくれました。セマフォの使い方にはまだ疑問があります。私はArduinoでそれらを使用しましたが、ここで私は少し混乱しています。その理由は、シリアル通信では、シリアルポートに接続してメッセージを送信したり、送信したりするいくつかの方法を持つクラスがあるからです。これまでは、このクラスのインスタンスをStartupTaskに作成して使用しました。今度は、App Serviceで別のインスタンスを作成する必要があります。これは最初のインスタンスと競合します。また、私はどのように2つのタスク間で同じセマフォを共有するのか分かりません。ありがとう – Carlos

関連する問題