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