6

MSDNによると、分離ストレージ内のファイルを介したフォアグラウンド アプリとバックグラウンド エージェント間の通信は、Mutex で保護する必要があります。

これを行う方法を説明している唯一の記事は、Dina Berry によるものです。ただし、彼女は Mutex で読み取りを保護しているだけで、書き込みは保護していないようです。

これを行う正しい方法は何ですか?

4

1 に答える 1

6

ミューテックスは複数のプロセス間でロックできます。これは、リソースへの排他的アクセスを必要とするスケジュールされたタスクを実行している場合に、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にアクセスしていることを確認することです。

それが基本的に違いです。モニターはミューテックスよりもはるかに高速です。

于 2012-04-25T06:06:40.877 に答える