Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保护应用程序和后台代理之间的共享isostorage数据_C#_Windows Phone 7_Mutex_Isolatedstorage_Background Agent - Fatal编程技术网

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

C# 保护应用程序和后台代理之间的共享isostorage数据,c#,windows-phone-7,mutex,isolatedstorage,background-agent,C#,Windows Phone 7,Mutex,Isolatedstorage,Background Agent,根据前台应用程序和后台代理之间通过隔离存储中的文件进行的通信,应使用互斥锁进行保护 我能找到的唯一一篇描述如何做到这一点的文章是迪娜·贝瑞写的。 然而,她似乎只是用互斥来保护读取,而不是写入 正确的方法是什么?互斥锁可以跨多个进程锁定。如果在Windows Phone中运行的计划任务需要以独占方式访问资源,则这将非常有用。为了跨进程锁定互斥体,必须为互斥体指定一个名称 监视器只能在进程内锁定 互斥锁示例: 手机应用程序任务: public class DatabaseService { pr

根据前台应用程序和后台代理之间通过隔离存储中的文件进行的通信,应使用互斥锁进行保护

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


正确的方法是什么?

互斥锁可以跨多个进程锁定。如果在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 DatabaseService
{
  private object _locker=new object();
  public void AddToDatabase(DbObject row)
  {
    lock(_locker)
        SaveRow(row);
  }
}
计划任务类:

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 ResourceUtilisation
{
  private object _locker=new object();
  //.. does stuff
  private static void UseResource()
  {

    //Go get dataabse and add some rows
    lock(_locker)
        DoStuff();
  }
}
在上面的示例中,我们一次只允许一个应用程序访问本地数据库资源。这就是为什么我们要使用互斥锁

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

手机应用程序任务:

public class DatabaseService
{
  private Mutex _mut=new Mutex("mutex control",false);
  public void AddToDatabase(DbObject row)
  {
    mut.WaitOne();
    SaveRow(row);
    mut.ReleaseMutex();
  }
}
public class DatabaseService
{
  private object _locker=new object();
  public void AddToDatabase(DbObject row)
  {
    lock(_locker)
        SaveRow(row);
  }
}
计划任务类:

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 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方法。我们不能使用监视器来确保一次只有一个线程访问本地数据库


这基本上就是区别。监视器也比互斥体快得多。

为什么在一种情况下创建具有initiallyOwned true的互斥体而在另一种情况下不创建?@Jesperrarsen Ledet initialOwned指示调用线程是否应该具有互斥体的初始所有权