6

MSDN隔離されたストレージ内のファイルによるフォアグラウンドアプリとバックグラウンドエージェント間の通信は、ミューテックスによって保護される必要があります。アプリとバックグラウンドエージェント間の共有アイソストレージデータの保護

これを行う方法については、Dina Berryのthis oneです。 しかし、彼女は書き込みだけでなく、ミューテックスで読み取りを保護するように見えます。

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

答えて

6

mutexは、複数のプロセス間でロックできます。これは、リソースへの排他的アクセスが必要なスケジュールされたタスクを実行している場合、Windows Phoneで役立ちます。プロセス間でミューテックスをロックするには、ミューテックスに名前を付ける必要があります。

モニタはプロセス内でのみロックできます。

ミューテックス例:

電話アプリのタスク:

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つのアプリを許可していますローカルデータベースリソース。これがミューテックスを使用する理由です。 (ロック構文を使用して)

モニター例:

電話アプリのタスク:

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メソッドに入るのを停止できます。モニターではできないことは、ただ1つのスレッドだけがローカルDBに同時にアクセスしていることです。

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

+2

なぜあなたは1つのケースではなく、他のケースではなく、当初のオリジナルでミューテックスを作成しますか? –

+1

@ JesperLarsen-Ledet initialOwnedは、呼び出し元のスレッドがミューテックスの初期所有権を持つ必要があるかどうかを示します – onmyway133

関連する問題