MSDNによると、分離ストレージ内のファイルを介したフォアグラウンド アプリとバックグラウンド エージェント間の通信は、Mutex で保護する必要があります。
これを行う方法を説明している唯一の記事は、Dina Berry によるものです。ただし、彼女は Mutex で読み取りを保護しているだけで、書き込みは保護していないようです。
これを行う正しい方法は何ですか?
ミューテックスは複数のプロセス間でロックできます。これは、リソースへの排他的アクセスを必要とするスケジュールされたタスクを実行している場合に、WindowsPhoneで役立ちます。プロセス間でミューテックスをロックするには、ミューテックスに名前を付ける必要があります。
モニターは、プロセス内でのみロックできます。
Mutexの例:
電話アプリのタスク:
public class DatabaseService
{
private Mutex _mut=new Mutex("mutex control",false);
public void AddToDatabase(DbObject row)
{
mut.WaitOne();
SaveRow(row);
mut.ReleaseMutex();
}
}
スケジュールされたタスククラス:
public class ResourceUtilisation
{
private Mutex _mut=new Mutex("mutex control",true);
//.. does stuff
private static void UseResource()
{
// Wait until it is safe to enter.
_mut.WaitOne();
//Go get dataabse and add some rows
DoStuff();
// Release the Mutex.
_mut.ReleaseMutex();
}
}
上記の例では、ローカルデータベースリソースへのアクセスを一度に1つのアプリにのみ許可しています。これが、Mutexを使用する理由です。
モニターの例(ロック構文を使用):
電話アプリのタスク:
public class DatabaseService
{
private object _locker=new object();
public void AddToDatabase(DbObject row)
{
lock(_locker)
SaveRow(row);
}
}
スケジュールされたタスククラス:
public class ResourceUtilisation
{
private object _locker=new object();
//.. does stuff
private static void UseResource()
{
//Go get dataabse and add some rows
lock(_locker)
DoStuff();
}
}
この例では、複数のアプリケーションスレッドがSaveRowに入るのを停止し、複数のScheduledTaskスレッドがDoStuffメソッドに入るのを停止できます。Monitorでできないことは、一度に1つのスレッドだけがローカルDBにアクセスしていることを確認することです。
それが基本的に違いです。モニターはミューテックスよりもはるかに高速です。