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

时间:2012-04-16 20:16:36

标签: c# windows-phone-7 mutex isolatedstorage background-agent

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

我能找到的唯一一篇描述如何做到这一点的文章是Dina Berry的this one。 但是,她似乎只使用互斥锁而不是写入来保护读取。

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

1 个答案:

答案 0 :(得分: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();
  }
}

计划任务类:

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();
  }
}

在上面的示例中,我们只允许一个应用程序一次访问本地数据库资源。这就是我们使用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执行的操作是确保只有一个线程一次访问本地数据库。

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