6

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

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

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

4

1 回答 1

6

互斥锁可以跨多个进程锁定。如果您正在运行需要独占访问资源的计划任务,这在 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();
  }
}

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

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

电话应用任务:

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 也比 Mutex 快得多。

于 2012-04-25T06:06:40.877 回答