保护应用程序和后台代理之间的共享isosorage数据

Jes*_*det 6 c# mutex isolatedstorage windows-phone-7 background-agent

根据MSDN前台应用程序和后台代理之间的通信,通过隔离存储中的文件应该受到Mutex的保护.

我能找到的唯一的文章介绍了如何做,这是这一个由迪娜·贝瑞.但是,她似乎只用Mutex保护读取而不是写入.

这样做的正确方法是什么?

Rak*_*air 6

互斥锁可以锁定多个进程.如果您运行的计划任务需要对资源的独占访问权限,这在Windows Phone中非常有用.为了跨进程锁定互斥锁,必须为Mutex指定名称.

监视器只能在进程内锁定.

互斥体示例:

电话应用任务:

public class DatabaseService
{
  private Mutex _mut=new Mutex("mutex control",false);
  public void AddToDatabase(DbObject row)
  {
    mut.WaitOne();
    SaveRow(row);
    mut.ReleaseMutex();
  }
}
Run Code Online (Sandbox Code Playgroud)

预定任务类:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我们只允许一个应用程序一次访问本地数据库资源.这就是我们使用Mutex的原因.

监控示例(使用锁定语法):

电话应用任务:

public class DatabaseService
{
  private object _locker=new object();
  public void AddToDatabase(DbObject row)
  {
    lock(_locker)
        SaveRow(row);
  }
}
Run Code Online (Sandbox Code Playgroud)

预定任务类:

public class ResourceUtilisation
{
  private object _locker=new object();
  //.. does stuff
  private static void UseResource()
  {

    //Go get dataabse and add some rows
    lock(_locker)
        DoStuff();
  }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我们可以阻止多个应用程序线程进入SaveRow,我们可以阻止多个ScheduledTask线程进入DoStuff方法.我们无法对Monitor执行的操作是确保只有一个线程一次访问本地DB.

这基本上就是差异.Monitor也比Mutex快得多.

  • 为什么在一种情况下创建具有initialOwned true的Mutex而不是另一种情况? (2认同)